0

我有一个 Scala-Play Web 服务应用程序,它执行一些生成鞍帧的计算,并且需要将这些鞍帧转储到 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")))
4

1 回答 1

1

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

您的操作不知道您要专门将其编写为 JSON,因此您需要返回Ok(Json.toJson(pnlStatistics)).

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

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

  • 由于还有一个隐含Writeable[JsValue]的范围,Ok因此接受此值作为您的响应的内容(并且还将添加Content-Type标头)。

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

于 2017-03-22T16:58:59.877 回答