json - 为 JSON 集类型定义 `Reads`

标签 json scala playframework playframework-json

如何为我的 People 案例类创建 play.api.libs.Reads

scala> type Id = Long
defined type alias Id

scala> case class People(names: Set[Id])
defined class People

scala>   implicit val PeopleReads: Reads[People] = (
     |     (__ \ "names").read[Set[Id]])(People)
<console>:21: error: overloaded method value read with alternatives:
  (t: Set[Id])play.api.libs.json.Reads[Set[Id]] <and>
  (implicit r: play.api.libs.json.Reads[Set[Id]])play.api.libs.json.Reads[Set[Id]]
 cannot be applied to (People.type)
           (__ \ "names").read[Set[Id]])(People)

最佳答案

(...)(People) 语法是为构建参数列表而设计的(嗯,从技术上讲,它是一个 Builder,而不是一个list) 与 and 并希望将 People 构造函数提升到 Reads 的应用仿函数中,以便您可以将其应用于这些参数。

例如,如果您的 People 类型如下所示:

case class People(names: Set[Id], home: String)

你可以这样写:

implicit val PeopleReads: Reads[People] = (
  (__ \ "names").read[Set[Id]] and
  (__ \ "home").read[String]
)(People)

但是,在您的情况下,People 的构造函数只有一个参数,并且您没有使用 and,因此您没有 Builder[Reads[Set[Id] ~ String],您刚刚得到了一个普通的旧Reads[Set[Id]]

这很好,因为这意味着您不需要奇怪的应用仿函数语法 - 您需要的只是 map:

implicit val PeopleReads = (__ \ "names").read[Set[Id]].map(People)

你就完成了。

关于json - 为 JSON 集类型定义 `Reads`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21461590/

相关文章:

java - Jersey Rest 服务无法使用 Json 注释工作

javascript - 如何合并 JSON 对象数组中的数组?

scala - SonarQube 的 Scala 配置文件在哪里?

scala - 新的 play-2.1.1 安装中缺少 sbt/boot/directory。在 Linux Mint 14 上安装 Playframework

scala - IntelliJ IDEA 中 Play 2 框架支持的损坏解决方案

json - TJSONObject销毁方法错误

php - Json_encode 以字符串形式返回 json 单元格

scala - 使用 Scala 选项验证命令行参数

scala - 过滤掉某些列的 NaN 值的行

playframework - 发挥 Play Framework 2.1 的理想化?