2016-02-25 35 views
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) 
      ^

我不不明白,我已经定义了作家和读者,不是吗?

在此先感谢。

回答

0

尝试定义下列实例。

implicit def MyTRead[T](implicit r: Reads[T]): Reads[MyTrait[T]] = ??? 
implicit def MyTWrite[T](implicit r: Writes[T]): Writes[MyTrait[T]] = ??? 
+0

这没有做到。我删除了我的读取和写入特征,并用它来代替,但编译器仍然不想将它用作MyTrait的序列化程序。也许我没有正确使用它。 –