繁体   English   中英

Scala Play:如何定义“ Json可写类”

[英]Scala Play: how to define a “Json writable class”

我想编写一个将案例类转换为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)
}

但是它说“没有为类型模型找到Json序列化器。JsonWritableResult[_ $ 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))

一般情况下未对此进行测试,但在工作表中似乎可以正常工作。

与其强迫案例类具有隐式, toJson强制使用案例类中定义的隐式,强制其从特征中覆盖toJson方法,这是更聪明的选择。 简单得多,而且有效。 然后,我的工厂可以在其输出类型中显式此特征,因此我可以序列化其输出的内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM