映射 case class 与伴生对象

Mapping case class with companion object

假设,我有流动 case classobject:

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")
  }