【问题标题】:Deserialize body of result which is a byte array to json response反序列化结果体,这是一个字节数组到 json 响应
【发布时间】:2015-06-03 22:30:52
【问题描述】:

我正在尝试获取结果的主体并将其反序列化为 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 对象?

【问题讨论】:

    标签: scala playframework playframework-2.3


    【解决方案1】:

    这是你想要的吗?

     [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.
    

    【讨论】:

    • bodyAsStr 不起作用 - 这是它为我打印的内容:Body as string: [B@5cc7c8f4
    • bodyAsJsValue 似乎代表了一个幻像值,即f
    • bodyAsJsValueFuture[JsValue]。播放是异步的。
    • 应该更冗长 - 我正在使用这段代码来测试输出println("Body as string: " + Await.result(bodyAsStr,5 seconds))
    【解决方案2】:

    我认为您需要 Helpers.scala 将字节数组类型的响应转换为字符串/json。

    参考:thisthis

    您可以将代码修改为:

        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 bodyAsStr = contentAsString(result)
        println("Body as string: " + bodyAsStr)
    
        val bodyAsJsValue = contentAsJson
        println("body as js: " + bodyAsJsValue)
        println("==============================")
    

    我希望这就是你要找的。​​p>

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多