2013-11-22 15 views
5

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?

Odpowiedz

1

Można zdefiniować format dla Node[T] bez użycia makra, ale to działa:

implicit val birdFormat: Format[Bird] = Json.format[Bird] 

implicit def nodeFormat[T : Format]: Format[Node[T]] = 
    ((__ \ "_id").format[Int] ~ 
    (__ \ "thing").format[T] 
)(Node.apply, unlift(Node.unapply)) 
+0

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

Powiązane problemy