如何为我的 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/