sheh
sheh

Reputation: 1023

Mapping case class with companion object

Suppose,I have flowing case class with object:

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

object A {
  def apply(c: String) = new A(c, 100500)
}

And I'm going to convert json like {"c": "foo"}to class A.

For it, I created protocol:

object AJsonProtocol extends DefaultJsonProtocol {
  implicit val aFormat = jsonFormat1(A.apply)
}

My application:

object Main {

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

}

When I start may application I get exception:

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

Why do I get this error?

How can I convert json like "{'c': 'foo'}" to class A?

Upvotes: 1

Views: 421

Answers (1)

grotrianster
grotrianster

Reputation: 2468

Your case class comes with apply method, and you define also apply method in campanion object, there is way to be specific, when you declare jsonFormat, and say which exactly apply method you want to use.

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

Upvotes: 5

Related Questions