使用伴随对象映射案例类

she*_*heh 1 scala spray-json

假设,我已经流case classobject

case class A(a: String, b: Int)

object A {
  def apply(c: String) = new A(c, 100500)
}
Run Code Online (Sandbox Code Playgroud)

我要把 json 转换{"c": "foo"}成 class A

为此,我创建了协议:

object AJsonProtocol extends DefaultJsonProtocol {
  implicit val aFormat = jsonFormat1(A.apply)
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序:

object Main {

  import AJsonProtocol._
  def main(args: Array[String]): Unit = {
    val r = """{"c": "foo"}""".parseJson.convertTo[A]
    println(r)
  }

}
Run Code Online (Sandbox Code Playgroud)

当我开始可能应用程序时,我得到异常:

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
Run Code Online (Sandbox Code Playgroud)

为什么我会收到这个错误?

如何将 json like 转换"{'c': 'foo'}"为 class A

gro*_*ter 5

你的case类带有apply方法,你在campanion对象中也定义了apply方法,有一种方法可以具体,当你声明jsonFormat时,并说明你想使用哪个apply方法。

object AJsonProtocol extends DefaultJsonProtocol {
    implicit val aFormat = jsonFormat[String, A](A.apply, "c")
  }
Run Code Online (Sandbox Code Playgroud)