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

标签 json scala generics playframework-2.2

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

相关文章:

scala - 如何将Java库包含到scala项目中

scala - 有没有简单的方法可以摆脱 SBT 生成的*所有内容*?

scala - 如何将此类型的 lambda 转换为 Kind-Projector 语法?

javascript - 动态添加带有jquery错误的元素

java - 想要将 json 对象映射为 java 对象

jquery - X-editable 和 Select2 与远程数据不起作用

ios - 如何在 UI 中快速显示 JSON

java - Java 通用节点数组

c# - 在一行中将字符串转换为 List<string>?

c# - 获取泛型数组中元素的Type