2013-11-22 12 views
5

Câu hỏi này được dựa trên ví dụ sau, đó là một nỗ lực để deserialize một trường hợp lớp Node [Bird] từ JSON.Tự động tuần tự hóa/deserialization của trường hợp chung lớp học đến/từ JSON trong 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]]] 

} 

Trong ví dụ trước, Scala không thể giải quyết đúng các hàm áp dụng/không áp dụng cho nút [Bird] cho macro định dạng.

// ERROR -- No apply function found matching unapply parameters 
    implicit val birdNodeFormat = Json.format[Node[Bird]] 

Tuy nhiên, không có vấn đề gì khi sử dụng lớp chữ thường không như BirdNode.

case class BirdNode(_id: Int, thing: Bird) 

    // WORKS 
    implicit val birdNodeFormat = Json.format[BirdNode] 

    ... 

    // WORKS 
    val birdNodesResult = birdNodesJson.validate[Seq[BirdNode]] 

Cách tốt nhất để sắp xếp/deserialize thứ gì đó như nút [Chim] đến/từ JSON trong Play 2.2 là gì?

Trả lời

1

Bạn có thể phải xác định định dạng cho Node[T] mà không sử dụng vĩ mô, nhưng hoạt động này:

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! Hóa ra là tôi đã thử điều này KHÔNG bằng cách sử dụng chức năng mở rộng. Như một lưu ý, hàm unapply trả về một Option [(arg1, arg2, ...)] và unifting nó cung cấp cho chúng ta (arg1, arg2, ...) mà chúng ta cần cho Writes. Xem [ScalaJsonCombinators] (http://www.playframework.com/documentation/2.2.x/ScalaJsonCombinators) – johnh

Các vấn đề liên quan