/ / Mapovanie triedy prípadov so spoločným objektom - scala, spray-json

Mapovanie triedy prípadov so spoločným objektom - scala, spray-json

Predpokladám, že tečie case class s object:

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

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

A budem konverzie json rád {"c": "foo"}do triedy A.

Pre to som vytvoril protokol:

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

Moja aplikácia:

object Main {

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

}

Keď začnem, môžem získať výnimku:

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

Prečo sa mi táto chyba vyskytla?

Ako môžem previesť ako "{"c": "foo"}" do triedy A?

odpovede:

4 pre odpoveď č. 1

Vaša trieda prípadov prichádza s metódou uplatnenia a vydefinovať tiež použiť metódu v campanion objekte, existuje spôsob, ako byť konkrétny, keď deklarujete jsonFormat, a povedzte, ktoré presne používajú metódu, ktorú chcete použiť.

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