jb4*_*b44 3 json scala implicits playframework playframework-2.0
我正在使用play框架,并有一个抽象类:
abstract class Base{...}
Run Code Online (Sandbox Code Playgroud)
在伴随对象中有自己的隐式JSON编写器
object Base {
implicit val baseWrites: Writes[Base] = (...)(unlift(Base.unapply))
}
Run Code Online (Sandbox Code Playgroud)
我是这个抽象类的子类:
case class SubClass{...}
Run Code Online (Sandbox Code Playgroud)
在其伴随对象中也有自己的隐式JSON编写器
object SubClass {
implicit val subClassWrites: Writes[SubClass] = (...)(unlift(SubClass.unapply))
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用Json.toJson(SubClass)序列化子类对象时,我收到一个错误:
[error] both value subClassWrites in object SubClass of type => play.api.libs.json.
Writes[models.SubClass]
[error] and value baseWrites in object Base of type =>
play.api.libs.json.Writes[models.Base]
[error] match expected type play.api.libs.json.Writes[models.SubClass]
[error] Ok(Json.toJson(SubClass.find(id)))
Run Code Online (Sandbox Code Playgroud)
有没有办法消除歧义?
sen*_*nia 14
您遇到了碰撞,因为Writes它具有逆变类型参数A:
trait Writes[-A] extends AnyRef
Run Code Online (Sandbox Code Playgroud)
这意味着它Writes[Base]是 - 的子类Writes[SubClass]- 您可以Writes[Base]在Writes[SubClass]需要的地方使用.
问题出在这里:
val base: Base = new SubClass(...)
val jsBase = Json.toJson(base)
Run Code Online (Sandbox Code Playgroud)
所以Writes[Base]应该能够序列化一个实例SubClass.你可以ADT在这种情况下使用:
sealed trait Base
object Base {
implicit val baseWrites: Writes[Base] =
new Writes[Base]{
def writes(o: Base): JsValue = o match {
case s: SubClass => SubClass.writes.writes(s)
case s: SubClass2 => SubClass2.writes.writes(s)
}
}
}
case class SubClass(...) extends Base
object SubClass {
val writes: Writes[SubClass] = (...)(unlift(SubClass.unapply))
}
case class SubClass2(...) extends Base
object SubClass2 {
val writes: Writes[SubClass2] = (...)(unlift(SubClass2.unapply))
}
Run Code Online (Sandbox Code Playgroud)
使用sealed关键字,如果match不是详尽无遗,您将收到警告.
| 归档时间: |
|
| 查看次数: |
2239 次 |
| 最近记录: |