To pytanie jest oparte na następującym przykładzie, który jest próbą deserializacji węzła klasy przypadków Node [Bird] z JSON.Automatyczne serializowanie/deserializacja ogólnych klas przypadków do/z JSON w Play2.2 Scala
import play.api.libs.json._
import play.api.libs.functional.syntax._
object ValidationTest {
case class Node[T](_id: Int, thing: T)
case class Bird(name: String, color: String)
// ERROR -- No apply function found matching unapply parameters
implicit val birdNodeFormat = Json.format[Node[Bird]]
val birdNodesJson: JsValue = Json.arr(
Json.obj(
"_id" -> 0,
"thing" -> Json.obj(
"name" -> "Cardinal",
"color" -> "Red"
)
),
Json.obj(
"_id" -> 1,
"thing" -> Json.obj(
"name" -> "Bluejay",
"color" -> "Blue"
)
)
)
val birdNodesResult = birdNodesJson.validate[Seq[Node[Bird]]]
}
W powyższym przykładzie Scala nie może rozpoznać właściwych funkcji zastosowania/anulowania dla węzła [Bird] dla makra formatu.
Jednak nie ma problemu z używaniem nietypowej klasy sprawy, takiej jak BirdNode.
case class BirdNode(_id: Int, thing: Bird)
// WORKS
implicit val birdNodeFormat = Json.format[BirdNode]
...
// WORKS
val birdNodesResult = birdNodesJson.validate[Seq[BirdNode]]
Jaki jest najlepszy sposób do serializacji/deserializacji coś takiego węzła [ptaków] do/od JSON w zagraj 2.2?
Awesome! Okazuje się, że próbowałem tego BEZ użycia funkcji unlift. Na marginesie, funkcja unapply zwraca opcję [(arg1, arg2, ...)], a jej anulowanie daje nam (arg1, arg2, ...), których potrzebujemy do zapisu. Zobacz [ScalaJsonCombinators] (http://www.playframework.com/documentation/2.2.x/ScalaJsonCombinators) – johnh