我使用case类为scala创建了一些json消息。例如:
case class Foo(name: String, attrs: List[String])
implicit val fooFormat = jsonFormat2(Foo)
object Foo {
case class Invalid(error: String)
}
case class Bar(name: String, kv: Map[String, String])
implicit val barFormat = jsonFormat2(Bar)
在上面的代码段中,barFormat
编译,但fooFormat
没有:
type mismatch; found : Foo.type required: (?, ?) => ?
Note: implicit value barFormat is not applicable here because it comes
after the application point and it lacks an explicit result type
我不想使用barFormat
代替fooFormat
,我理解一个案例类会自动生成一个伴随对象,但我不明白为什么这里有编译错误,并且错误信息对我来说很难破译。有谁知道这里的问题是什么以及如何解决它,最好不要删除我的Foo
伴侣对象?
答案 0 :(得分:8)
从编译错误看,jsonFormat2
需要一个双参数函数。你的意思是将Foo
和Bar
的构造函数传递给它吗?如果是,您应该Foo.apply
和Bar.apply
。
答案 1 :(得分:4)
Case类伴随对象默认会扩展其中一个函数特征。 object Foo
会扩展((String, List[String]) => Foo)
,但是当您手动定义它时,您没有扩展该特征。这就是为什么你无法将它传递给期待jsonFormat2
的{{1}}。如果进行以下更改,则应编译代码:
(?, ?) => ?
答案 2 :(得分:1)
Spray.json documentation建议比@ wingedsubmariner的建议更简单:
如果您明确声明了案例类的伴随对象 上面的符号将停止工作。你必须明确提到 配对对象的
apply
方法来解决这个问题:
因此问题的更正变为:
implicit val fooFormat = jsonFormat2(Foo.apply)
补充说:这实际上也是@geoffliu在答案中的建议。