gpt4 book ai didi

json - Play2.2 Scala 中通用案例类与 JSON 之间的自动序列化/反序列化

转载 作者:行者123 更新时间:2023-12-02 03:02:17 25 4
gpt4 key购买 nike

此问题基于以下示例,该示例尝试从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com