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ì?
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