【问题标题】:Scala-Play Json: How to define a Writes for any Saddle Frame?Scala-Play Json:如何为任何鞍架定义写入?
【发布时间】:2017-03-23 00:58:59
【问题描述】:

我有一个 Scala-Play Web 服务应用程序,它进行一些计算以生成 Saddle frames 并需要将这些鞍帧转储到 Json 中。所以我这样定义frameWrites

object JsonUtils {
  implicit def frameWrites[RX, CX, E] = new Writes[Frame[RX, CX, E]] {
    override def writes(frame: Frame[RX, CX, E]): JsValue = {
      val json: JsArray = Json.arr(
        (0 until frame.numRows).map { i =>
          Json.obj(
            frame.rowIx.at(i).toString ->
              (0 until frame.numCols).map { j =>
                Json.obj(
                  frame.colIx.at(j).toString -> frame.at(i, j).toString
                )
              }
          )
        })
        json
      }
  }
}

然后尝试像这样使用它:

import utils.JsonUtils._

def computingAction = Action {
   val pnlStatistics: Frame[String, String, Double] = ???
   Ok(pnlStatistics) 
}

但总是得到错误Cannot write an instance of org.saddle.Frame[String,String,Double] to HTTP response. Try to define a Writeable[org.saddle.Frame[String,String,Double]]

为了明确起见,我也尝试将其定义为 JsonUtils 的一部分:

implicit def frameSSDWrites = frameWrites[String, String, Double]

但这一个也没有被捡起......

UPDATE 显式调用作者有效:

Ok(frameWrites.writes(results("PnlStatistics")))

【问题讨论】:

  • 但是你需要实现 Writeable 而不是 Writes,对吧?

标签: json scala playframework saddle


【解决方案1】:

播放结果输入必须是一些可以放入 HTTP 响应的内容。

你的action不知道你要专门写成JSON,所以需要返回Ok(Json.toJson(pnlStatistics))

让我们看看它是如何工作的:

  • pnlStatistics 的类型是Frame,因此您可以使用隐式Writes[Frame] 将其序列化为JSON,因此Json.toJson 接受它作为参数。然后它返回一个JsValue

  • 1234563

如果您忘记了显式的JSON 转换,Play 无法确定您希望在响应中如何处理帧。

【讨论】:

  • 感谢您提供详细而有根据的答案!我检查了一下,效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2013-03-18
  • 2016-10-24
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多