Scala Play:如何定义一个 "Json writable class"
Scala Play: how to define a "Json writable class"
我想编写一个函数,将大小写 classes 转换为 Json:
import play.api.libs.json._
def myJson(cc: Product): JsValue = {
Json.toJson(cc) // simplified
}
每个案例 class 都有一个隐含的 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。
[如何编写函数签名,使其只需要 class 个具有 Writes
隐式?]
编辑:如何编写函数输入类型,使其仅对应于具有 Writes
隐式的 classes?
我试过这个:
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)
}
但是上面写着"No Json serializer found for type models.JsonWritableResult[_]".
类似这样的东西似乎会给你想要的行为。
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))
这在一般情况下未经过测试,但在工作表中似乎有效。
与其强制案例 class 具有隐式,更聪明的做法是强制它从特征覆盖 toJson
方法,使用或不使用案例中定义的隐式 class。更简单,它的工作原理。然后我的工厂可以在它的输出类型中明确这个特征,因此我可以序列化它输出的任何东西。
但由于其他答案回答了我表述错误的问题,我接受了;)
我想编写一个函数,将大小写 classes 转换为 Json:
import play.api.libs.json._
def myJson(cc: Product): JsValue = {
Json.toJson(cc) // simplified
}
每个案例 class 都有一个隐含的 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。
[如何编写函数签名,使其只需要 class 个具有 Writes
隐式?]
编辑:如何编写函数输入类型,使其仅对应于具有 Writes
隐式的 classes?
我试过这个:
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)
}
但是上面写着"No Json serializer found for type models.JsonWritableResult[_]".
类似这样的东西似乎会给你想要的行为。
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))
这在一般情况下未经过测试,但在工作表中似乎有效。
与其强制案例 class 具有隐式,更聪明的做法是强制它从特征覆盖 toJson
方法,使用或不使用案例中定义的隐式 class。更简单,它的工作原理。然后我的工厂可以在它的输出类型中明确这个特征,因此我可以序列化它输出的任何东西。
但由于其他答案回答了我表述错误的问题,我接受了;)