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ď č. 1Vaš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")
}