3

我正在尝试在 Play 2.1 中编写一种通用的方式来处理将类写入JSON 的方式,因为我认为为您使用Pk的每种类型编写一个单独的方式是很浪费的。Pk这是我到目前为止所拥有的:

implicit def pkWrites[E] = new Writes[Pk[E]] {
    def writes(pk: Pk[E]): JsValue = Json.toJson(pk.get)
}

...我在这样的代码中使用它:

Json.toJson(Id(42L))

现在,这种工作(Scala 找到它)但这是我得到的错误:

No Json deserializer found for type E. 
Try to implement an implicit Writes or Format for this type.

其中 typeELong(因此,有一个反序列化器)。无论如何我可以告诉我是Json.toJson什么类型E吗?

4

1 回答 1

2

您唯一需要做的就是确保E在范围内有用于类型的反序列化器,因为现在您不能确定您使用的每种类型都是可写的。你可以试试:

class Value[A](value: A){
  def get[A] = value
}

implicit def valueWrites[E](implicit longWrites: Writes[E]) = new Writes[Value[E]]{
    def writes(value: Value[E]): JsValue = Json.toJson(value.get)
}

Json.toJson(new Value(5L))

您可以将隐式方法缩短为:

implicit def valueToJson[E: Writes] = new Writes[Value[E]]{
    def writes(value: Value[E]): JsValue = Json.toJson(value.get)
}

编辑:

上面这两个方法完全一样,这意味着方法需要隐式值,在你的情况下Pk[Long],所以这个方法知道如何反序列化数字。换句话说,E: Writes告诉方法:搜索 type 的隐含值Writes[E]

编辑2:

Json.toJson(1)有效,因为Writes[Int]在范围内。以同样的方式工作valueWrites[Int],有Writes[Int]范围,所以方法可以Writes[Int]用来反序列化字段value,从而反序列化整个类。

于 2013-06-25T19:49:07.790 回答