我有以下代码,它使用spray-json通过该parseJson方法将一些JSON反序列化为case类.
根据隐式JsonFormat [MyCaseClass]的定义位置(在线或从伴随对象导入),以及在定义时是否提供显式类型,代码可能无法编译.
我不明白为什么从配对对象导入隐式需要它在定义时具有显式类型,但如果我把它内联,那不是这种情况?
有趣的是,IntelliJ在所有情况下都正确地定位了隐式参数(通过cmd-shift-p).
我正在使用Scala 2.11.7.
Broken Code - 来自伴侣对象的通配符导入,推断类型:
import SampleApp._
import spray.json._
class SampleApp {
import MyJsonProtocol._
val inputJson = """{"children":["a", "b", "c"]}"""
println(s"Deserialise: ${inputJson.parseJson.convertTo[MyCaseClass]}")
}
object SampleApp {
case class MyCaseClass(children: List[String])
object MyJsonProtocol extends DefaultJsonProtocol {
implicit val myCaseClassSchemaFormat = jsonFormat1(MyCaseClass)
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
Cannot find JsonReader or JsonFormat type class for SampleAppObject.MyCaseClass
Run Code Online (Sandbox Code Playgroud)
请注意,显式导入myCaseClassSchemaFormat隐式时会发生同样的事情.
工作代码#1 - 来自伴侣对象的通配符导入,显式类型:
将显式类型添加到随播对象中的JsonFormat会导致代码编译:
import SampleApp._
import spray.json._
class SampleApp {
import MyJsonProtocol._
val inputJson = """{"children":["a", …Run Code Online (Sandbox Code Playgroud)