使用伴随对象映射案例类

时间:2015-08-31 15:01:00

标签: scala spray-json

假设我已upcase class流动:

object

我要将case class A(a: String, b: Int) object A { def apply(c: String) = new A(c, 100500) } 之类的json转换为类{"c": "foo"}

为此,我创建了协议:

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

1 个答案:

答案 0 :(得分:4)

你的case类附带了apply方法,你在campanion对象中定义了apply方法,当你声明jsonFormat时,有特定的方法,并说明你想要使用哪种方法。

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