伴随对象、隐式和 Json
Companion objects, implicits, and Json
我在为我也有 Json 格式的类型添加隐式定义的类型转换器时遇到问题。我怀疑问题是否与 Json (或 Spray)有关。或者 MyDate 就此而言。
这是导致我遇到的问题的代码片段:
case class MyDate(y: Int, m: Int, d: Int)
object JsonProblem extends App {
import spray.json.{DefaultJsonProtocol, _}
object MyJsonProtocol extends DefaultJsonProtocol with NullOptions {
implicit val myDateFormat = jsonFormat3(MyDate)
}
import MyJsonProtocol._
val exampleDate = """{ "y": 2016, "m": 7, "d": 11 }"""
val y: MyDate = exampleDate.parseJson.convertTo[MyDate]
}
到目前为止,一切都按预期进行。值 y 采用 MyDate.
的适当实例
现在,在 case class 定义之后(尽管我认为将这段代码放在哪里并不重要),我引入了一个伴生对象:
object MyDate {
implicit def convertMyDateToInt(x: MyDate): Int = ???
}
我立即在 myDateFormat 行收到编译器错误:*无法解析具有此类签名的引用 jsonFormat3*。我的附加代码的目的与 Json 解析无关(从我的角度来看)。这是因为在代码的其他部分我想将 MyDate 隐式转换为 Int.
我希望这与我用自己的对象替换(或增强)编译器生成的伴生对象有关。但问题到底是什么,我该如何解决?
只需使用伴生对象应用函数
import spray.json._
case class MyDate(y: Int, m: Int, d: Int)
object MyDate {
implicit def convertMyDateToInt(x: MyDate): Int = ???
}
object JsonProblem extends App {
object MyJsonProtocol extends DefaultJsonProtocol with NullOptions {
implicit val myDateFormat:RootJsonFormat[MyDate] = jsonFormat3(MyDate.apply)
}
import MyJsonProtocol._
val exampleDate = """{ "y": 2016, "m": 7, "d": 11 }"""
val y: MyDate = exampleDate.parseJson.convertTo[MyDate]
}
我在为我也有 Json 格式的类型添加隐式定义的类型转换器时遇到问题。我怀疑问题是否与 Json (或 Spray)有关。或者 MyDate 就此而言。
这是导致我遇到的问题的代码片段:
case class MyDate(y: Int, m: Int, d: Int)
object JsonProblem extends App {
import spray.json.{DefaultJsonProtocol, _}
object MyJsonProtocol extends DefaultJsonProtocol with NullOptions {
implicit val myDateFormat = jsonFormat3(MyDate)
}
import MyJsonProtocol._
val exampleDate = """{ "y": 2016, "m": 7, "d": 11 }"""
val y: MyDate = exampleDate.parseJson.convertTo[MyDate]
}
到目前为止,一切都按预期进行。值 y 采用 MyDate.
的适当实例现在,在 case class 定义之后(尽管我认为将这段代码放在哪里并不重要),我引入了一个伴生对象:
object MyDate {
implicit def convertMyDateToInt(x: MyDate): Int = ???
}
我立即在 myDateFormat 行收到编译器错误:*无法解析具有此类签名的引用 jsonFormat3*。我的附加代码的目的与 Json 解析无关(从我的角度来看)。这是因为在代码的其他部分我想将 MyDate 隐式转换为 Int.
我希望这与我用自己的对象替换(或增强)编译器生成的伴生对象有关。但问题到底是什么,我该如何解决?
只需使用伴生对象应用函数
import spray.json._
case class MyDate(y: Int, m: Int, d: Int)
object MyDate {
implicit def convertMyDateToInt(x: MyDate): Int = ???
}
object JsonProblem extends App {
object MyJsonProtocol extends DefaultJsonProtocol with NullOptions {
implicit val myDateFormat:RootJsonFormat[MyDate] = jsonFormat3(MyDate.apply)
}
import MyJsonProtocol._
val exampleDate = """{ "y": 2016, "m": 7, "d": 11 }"""
val y: MyDate = exampleDate.parseJson.convertTo[MyDate]
}