0
如果我有一個特點,如:斯卡拉通用型播放框架JSON序列
trait MyTrait[T] {
def myVal: T
}
然後,我有一個案例類,如:
case class MyClass(val foo: Int, val myVal: Boolean) extends MyTrait[Boolean]
最後,我還有一個案例類
case class MyOtherClass(val bar: MyTrait[_])
如何序列化和反序列化最後一個類到Json?
我做了讀取和寫入myClass的如下:
object MyClass {
implicit def MyClassWrites(implicit fmt: MyClass): Writes[MyClass] = new Writes[MyClass] {
override def writes(m: MyClass) = Json.obj(
"foo" -> m.foo,
"myVal" -> m.myVal // myVal should be Boolean
)
}
implicit def MyClassReads(implicit fmt: Reads[MyClass]): Reads[MyClass] = new Reads[MyClass] {
override def reads(json: JsValue): MyClass = new MyClass(
(json \ "foo").as[Int],
true
)
}
}
myOtherClass還具有讀取和寫入,如下所示:
object MyOtherClass {
implicit def MyOtherClassWrites(implicit fmt: MyOtherClass): Writes[MyOtherClass] = new Writes[MyOtherClass] {
override def writes(m: MyOtherClass) = Json.obj(
"bar" -> Json.toJson(m.bar)
)
}
implicit def MyOtherClassReads(implicit fmt: Reads[MyOtherClass]): Reads[MyOtherClass] = new Reads[MyOtherClass] {
override def reads(json: JsValue): MyClass = new MyOtherClass(
(json \ "bar").as[MyClass[Boolean]]
)
}
}
編譯時,我得到以下錯誤:
Error:(43, 28) No Json serializer found for type A$A135.this.MyTrait[_$1]. Try to implement an implicit Writes or Format for this type.
"bar" -> Json.toJson(m.bar)
^
如果我添加一個寫入特徵如下:
object MyTrait {
implicit def MyClassWrites(implicit fmt: MyTrait[_]): Writes[MyTrait[_]] = new Writes[MyTrait[_]] {
override def writes(m: MyTrait[_]) = Json.obj(
"myVal" -> Json.toJson(m.myVal) // myVal should be Boolean
)
}
implicit def MyClassReads(implicit fmt: Reads[MyTrait[_]]): Reads[MyTrait[_]] = new Reads[MyTrait[_]] {
override def reads(json: JsValue): MyTrait[_] = new MyClass(2, false)
}
}
現在我得到這個錯誤:
Error:(10, 30) No Json serializer found for type _$4. Try to implement an implicit Writes or Format for this type.
"myVal" -> Json.toJson(m.myVal) // myVal should be Boolean
^
我在這裏失去了,是不是有什麼辦法來序列酒吧,就好像它是一個MyClass的?
I'vr也試圖改變MyTrait作家如下:
override def writes(m: MyTrait[_]) = {
m match {
case c: MyClass => Json.toJson(c)
}
}
現在爲特質的作家編譯,但我們回到第一個錯誤:
Error:(45, 28) No Json serializer found for type A$A199.this.MyTrait[_$9]. Try to implement an implicit Writes or Format for this type.
"bar" -> Json.toJson(m.bar)
^
我不不明白,我已經定義了作家和讀者,不是嗎?
在此先感謝。
這沒有做到。我刪除了我的讀取和寫入特徵,並用它來代替,但編譯器仍然不想將它用作MyTrait的序列化程序。也許我沒有正確使用它。 –