使用spray.json获取序列化多态类无法找到类型的证据参数的隐式值

时间:2015-05-17 14:21:18

标签: scala spray

我正在尝试制作json

trait Bar
case class Foo(name:String) extends Bar
case class Buz(name:String,age:Int) extends Bar
case class Responsive(id:String ,bars:List[Bar])

致电

import spray.json._
val foo  = Foo("foo")
val fooRes  = Responsive("abc",List(foo))

println(fooRes.toJson)

我正在

Cannot find JsonWriter or JsonFormat type class for com.demo.Responsive
          println(s" res = ${fooRes.toJson}")
                                    ^

当我添加

implicit val impResponsive = jsonFormat2(Responsive)

我正在

`could not find implicit value for evidence parameter of type` com.demo.routing.JsonImplicits.JF[List[com.avi.demo.Bar]]
 implicit val impResponsive = jsonFormat2(Responsive)
                                          ^

为什么我会收到这些错误?我怎么解决呢?

1 个答案:

答案 0 :(得分:1)

您在Responsive上遇到的错误实际上是由于此类包含对Bar的引用以及您没有({de-)序列化器Bar的事实。 1}}特质。更详细地说,类型系统知道您可以(取消)序列化FooBuzResponsive的实例,因为您在范围内具有适当的格式。但是类型系统怎么知道你可以(去)序列化通用Bar

如果spray-json可以支持这个用例,使Bar特征密封并为其子女定义序列化器,那将是很好的,但我担心这也不会起作用。最后,您需要为Bar特征编写自定义序列化程序。如果您需要证明错误是由此引起的,只需将以下内容添加到隐式格式中:

implicit val barFormat: RootJsonFormat[Bar] = ???

现在应该编译所有内容,但由于???而显然在运行时失败。