scala - 将结果主体反序列化为 json 响应的字节数组

标签 scala playframework playframework-2.3

我正在尝试获取结果正文并将其反序列化为 JSON。

   val str = """ {"protectedBitcoinAddress":"moLM1zdPBSh81eykhfcoLZ3myqUSy9FRRG"} """
   val request : JsValue = Json.parse(str)
   println("Request: " + request.toString)
   val result : Future[Result] = createUnsignedNLockTime()(FakeRequest().withJsonBody(request))

   whenReady(result, timeout(19 seconds), interval(5 millis)) { res =>
    println("==============================")
    val e: play.api.libs.iteratee.Enumerator[Array[Byte]] = res.body

    val bodyAsStr: scala.concurrent.Future[String] = e.run(play.api.libs.iteratee.Iteratee.fold("") { (memo, next) => memo + next })

    println("Body as string: " + Await.result(bodyAsStr,5 seconds))
    val bodyAsJsValue: scala.concurrent.Future[play.api.libs.json.JsValue] = e.map(play.api.libs.json.Json.parse)

    println("body as js: " + Await.result(bodyAsJsValue, 5 seconds))
    println("==============================")
  }

如何获取 Enumerator[scala.Array[scala.Byte]] 类型的内容并将其转换为 Playframework 中的 Json 对象?

最佳答案

这是你想要的吗?

 [info] Starting scala interpreter...
[info]
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_79).
Type in expressions to have them evaluated.
Type :help for more information.

scala>import play.api.mvc.{Result, Results}
import play.api.mvc.{Result, Results}

scala>import play.api.libs.iteratee.{Enumerator, Iteratee}
import play.api.libs.iteratee.{Enumerator, Iteratee}

scala>import play.api.libs.json.Json
import play.api.libs.json.Json

scala>import scala.concurrent.{Await, Future}
import scala.concurrent.{Await, Future}

scala>import scala.concurrent.duration._
import scala.concurrent.duration._

scala>import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global

scala>val result: Result = Results.Ok(Json.stringify(Json.toJson(Map("k" -> "v")))).as("application/json")
result: play.api.mvc.Result = Result(200, Map(Content-Type -> application/json))

scala>val enumerator: Enumerator[Array[Byte]] = result.body
enumerator: play.api.libs.iteratee.Enumerator[Array[Byte]] = play.api.libs.iteratee.Enumerator$$anon$18@70d59654

scala>val bodyAsBytesEventually: Future[Array[Byte]] = enumerator.run(Iteratee.fold(Array.empty[Byte]) { (memo, nextChunk) => memo ++ nextChunk })
bodyAsBytesEventually: scala.concurrent.Future[Array[Byte]] = scala.concurrent.impl.Promise$DefaultPromise@8786f46

scala>val bodyAsStrEventually = bodyAsBytesEventually.map(bytes => new String(bytes))
bodyAsStrEventually: scala.concurrent.Future[String] = scala.concurrent.impl.Promise$DefaultPromise@442b7dd6

scala>val bodyAsStr = Await.result(bodyAsStrEventually, 1.seconds)
bodyAsStr: String = {"k":"v"} // In general, do not block unless you know what you are doing.

关于scala - 将结果主体反序列化为 json 响应的字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30631943/

相关文章:

playframework - 在 application.conf 中加密数据库密码

java - Play Framework 1.2.4 将项目导出/导入到 Eclipse IDE

mongodb - Playframework 2.3x : scala. concurrent.Future[play.api.mvc.Result])play.api.mvc.Action[play.api.mvc.AnyContent]

sbt - 如何在Play 2.3中使用publish/publishLocal发布webjar资源?

scala - 如何使用 SBT 和 Scala 在开发和生产中正确管理 logback 配置?

json - 使用 Scala 简单将 JSON 转换为 XML,然后将 XML 转换为 JSON

scala - Spark 2.3 动态分区不能在 S3 AWS EMR 5.13.0 上工作

eclipse - 将 scalacheck 与 Propspec 和 PropertyCheck 一起使用时,如何让 ScalaTest 正确报告测试结果?

javascript - 如何将 Scala 模板中的 ID 放入 AJAX 调用中?

deployment - 在Ubuntu 14.04生产服务器上部署Play Framework 2.3.x(Java样式)