使用 spray.json 获取序列化多态 类 找不到类型证据参数的隐式值
serializing polymorphic classes using spray.json getting could not find implicit value for evidence parameter of type
我正在尝试生产 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)
^
为什么我会收到这些错误?我该如何解决?
您在 Responsive
上遇到的错误实际上是由于此 class 包含对 Bar
的引用以及您没有 (de- ) Bar
特征的序列化器。更详细地说,类型系统知道您可以(反)序列化 Foo
、Buz
和 Responsive
的实例,因为您在范围内具有适当的格式。但是类型系统怎么知道你可以(反)序列化一个泛型 Bar
?
如果 spray-json 可以支持这个用例,使 Bar
特征密封并为其子项定义序列化程序,那就太好了,但恐怕这也行不通.最后,您需要为 Bar
特性编写自定义序列化程序。如果你想证明错误是由于这个造成的,只需将以下内容添加到你的隐式格式中:
implicit val barFormat: RootJsonFormat[Bar] = ???
现在一切都应该编译了,但显然由于 ???
.
在运行时失败了
我正在尝试生产 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)
^
为什么我会收到这些错误?我该如何解决?
您在 Responsive
上遇到的错误实际上是由于此 class 包含对 Bar
的引用以及您没有 (de- ) Bar
特征的序列化器。更详细地说,类型系统知道您可以(反)序列化 Foo
、Buz
和 Responsive
的实例,因为您在范围内具有适当的格式。但是类型系统怎么知道你可以(反)序列化一个泛型 Bar
?
如果 spray-json 可以支持这个用例,使 Bar
特征密封并为其子项定义序列化程序,那就太好了,但恐怕这也行不通.最后,您需要为 Bar
特性编写自定义序列化程序。如果你想证明错误是由于这个造成的,只需将以下内容添加到你的隐式格式中:
implicit val barFormat: RootJsonFormat[Bar] = ???
现在一切都应该编译了,但显然由于 ???
.