Scala Play:如何定义一个" Json可写类"

时间:2016-12-06 12:35:30

标签: json scala playframework playframework-2.5

我想编写一个将case类转换为Json的函数:

import play.api.libs.json._

def myJson(cc: Product): JsValue = {
  Json.toJson(cc)  // simplified
}

每个案例类都有一个隐式Writes[T],例如:

case class Test(a: Int)
object Test {
  implicit val jsonWrites: Writes[Test] = Json.writes[Test]
}

可以单独编写Json.toJson(new Test(1)),但上面的myJson函数不能编译,因为它永远不知道cc是否有一个隐式的Writes定义。

[如何编写函数签名,以便只使用隐含Writes的类?]

编辑:如何编写函数输入类型,使其仅对应Writes隐式的类?

我试过了:

trait JsonWritableResult[T <: Product] {
  implicit val jsonWrites: Writes[T]
}

case class Test(a: Int)
object Test extends JsonWritableResult[Test] {
  implicit val jsonWrites: Writes[Test] = Json.writes[Test]
}

def myJson(cc: JsonWritableResult[_ <: Product]): JsValue = {
  Json.toJson(cc)
}

但它说&#34;没有找到类型型号的Json序列化器.JsonWritableResult [_ $ 2]&#34;

2 个答案:

答案 0 :(得分:2)

这样的事情似乎能给你你想要的行为。

import play.api.libs.json.{JsValue, Json, Writes}

trait Product {}

case class Test(a: Int) extends Product
object Test {
  implicit val jsonWrites: Writes[Test] = Json.writes[Test]
}

def myJson[T <: Product](cc: T)(implicit writes: Writes[T]): JsValue = {
  Json.toJson(cc)  // simplified
}

import Test._

myJson(Test(3))

这在一般情况下未经过测试,但在工作表中似乎有效。

答案 1 :(得分:0)

不是强制case类具有隐式,而是强制它从trait覆盖toJson方法,使用或不使用case类中的隐式定义更聪明。更简单,它的工作原理。然后我的工厂可以在其输出类型中显示这个特征,因此我可以序列化它输出的任何内容。

但是,由于另一个答案回答了我提出错误的问题,我接受了;)