我正在使用 Scala Play 编写 Web 服务。功能还可以,但我正在重构一些部分以使我的代码更具可读性和清洁性。
我对我的每个实体类都使用了隐式来使它们可以转换为 Json。我还注入toJson
了函数,Seq[MyEntityClass]
以便能够通过调用单个函数来创建 Json 数组。
它看起来像这样:
case class MyModel(id: Option[Int], foo: String, bar: String)
object MyModel {
implicit val writer = Json.writes[MyModel]
implicit val reader: Reads[MyModel] = new Reads[MyModel] {
def reads(json: JsValue): JsResult[MyModel] = {
for {
foo <- (json \ "foo").validate[String]
bar <- (json \ "bar").validate[String]
} yield MyModel(None, foo, bar)
}
}
implicit def richMyModelSeq(apps: Seq[MyModel]) = new {
def toJson:JsValue = Json.toJson(apps)
}
// ...
}
如何在超类中定义此代码以不为每个实体类重复此代码?
为什么这不起作用?
abstract class Jsonable {
implicit val writer = Json.writes[Jsonable]
implicit def richMyModelSeq(apps: Seq[MyModel]) = new {
def toJson:JsValue = Json.toJson(apps)
}
}
case class MyModel(id: Option[Int], foo: String, bar: String)
object MyModel extends Jsonable{
implicit val reader: Reads[MyModel] = new Reads[MyModel] {
def reads(json: JsValue): JsResult[MyModel] = {
for {
foo <- (json \ "foo").validate[String]
bar <- (json \ "bar").validate[String]
} yield MyModel(None, foo, bar)
}
}
// ...
}