映射 case class 与伴生对象
Mapping case class with companion object
假设,我有流动 case class
和 object
:
case class A(a: String, b: Int)
object A {
def apply(c: String) = new A(c, 100500)
}
我要将 json 像 {"c": "foo"}
转换为 class A
。
为此,我创建了协议:
object AJsonProtocol extends DefaultJsonProtocol {
implicit val aFormat = jsonFormat1(A.apply)
}
我的申请:
object Main {
import AJsonProtocol._
def main(args: Array[String]): Unit = {
val r = """{"c": "foo"}""".parseJson.convertTo[A]
println(r)
}
}
当我启动可能的应用程序时出现异常:
Exception in thread "main" java.lang.ExceptionInInitializerError
at Main$.main(Main.scala:21)
at Main.main(Main.scala)
Caused by: scala.MatchError: [Ljava.lang.String;@6328d34a (of class [Ljava.lang.String;)
at spray.json.ProductFormatsInstances$class.jsonFormat1(ProductFormatsInstances.scala:23)
at AJsonProtocol$.jsonFormat1(Main.scala:13)
at AJsonProtocol$.<init>(Main.scala:14)
at AJsonProtocol$.<clinit>(Main.scala)
... 2 more
为什么会出现此错误?
我怎样才能将 json 像 "{'c': 'foo'}"
转换成 class A
?
你的案例class带有apply方法,你在campanion对象中也定义了apply方法,有具体的方法,当你声明jsonFormat时,并说出你想使用哪个apply方法。
object AJsonProtocol extends DefaultJsonProtocol {
implicit val aFormat = jsonFormat[String, A](A.apply, "c")
}
假设,我有流动 case class
和 object
:
case class A(a: String, b: Int)
object A {
def apply(c: String) = new A(c, 100500)
}
我要将 json 像 {"c": "foo"}
转换为 class A
。
为此,我创建了协议:
object AJsonProtocol extends DefaultJsonProtocol {
implicit val aFormat = jsonFormat1(A.apply)
}
我的申请:
object Main {
import AJsonProtocol._
def main(args: Array[String]): Unit = {
val r = """{"c": "foo"}""".parseJson.convertTo[A]
println(r)
}
}
当我启动可能的应用程序时出现异常:
Exception in thread "main" java.lang.ExceptionInInitializerError
at Main$.main(Main.scala:21)
at Main.main(Main.scala)
Caused by: scala.MatchError: [Ljava.lang.String;@6328d34a (of class [Ljava.lang.String;)
at spray.json.ProductFormatsInstances$class.jsonFormat1(ProductFormatsInstances.scala:23)
at AJsonProtocol$.jsonFormat1(Main.scala:13)
at AJsonProtocol$.<init>(Main.scala:14)
at AJsonProtocol$.<clinit>(Main.scala)
... 2 more
为什么会出现此错误?
我怎样才能将 json 像 "{'c': 'foo'}"
转换成 class A
?
你的案例class带有apply方法,你在campanion对象中也定义了apply方法,有具体的方法,当你声明jsonFormat时,并说出你想使用哪个apply方法。
object AJsonProtocol extends DefaultJsonProtocol {
implicit val aFormat = jsonFormat[String, A](A.apply, "c")
}