Reputation: 1023
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
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