此问题基于以下示例,该示例尝试从 JSON 反序列化案例类 Node[Bird]。
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]]]
}
在前面的示例中,Scala 无法解析格式宏的 Node[Bird] 的正确应用/取消应用函数。
// ERROR -- No apply function found matching unapply parameters
implicit val birdNodeFormat = Json.format[Node[Bird]]
但是,使用非泛型案例类(例如 BirdNode)没有问题。
case class BirdNode(_id: Int, thing: Bird)
// WORKS
implicit val birdNodeFormat = Json.format[BirdNode]
...
// WORKS
val birdNodesResult = birdNodesJson.validate[Seq[BirdNode]]
在 Play 2.2 中将 Node[Bird] 等内容与 JSON 进行序列化/反序列化的最佳方式是什么?
最佳答案
您可能必须在不使用宏的情况下定义 Node[T]
的格式,但这有效:
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))
关于json - Play2.2 Scala 中通用案例类与 JSON 之间的自动序列化/反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20134595/