编译器错误读取单个路径的[T]

时间:2016-05-12 09:09:52

标签: playframework playframework-2.0

Play 2.5.x文档没有提供一个示例,我可以使用它来为我的模型定义隐式Reads [T]来尝试排序我的问题。

有人可以指出我做错了吗?

我的模特:

case class Entry(id: Int, typ: String, caught: ZonedDateTime)
case class Data(entries: Seq[Entry])

条目类型的以下读取正常。

 implicit val entryReads: Reads[Entry] = (
      (__ \ "id").read[Int] and
      (__ \ "typ").read[String] and
      (__ \ "caught").read[ZonedDateTime]
    )(Entry.apply _)

问题

是我的Reads[Data]。编译器抱怨它需要数据而不是条目。

找到:Reads[api.test.Entry]必填:Reads[api.test.Data]

implicit val dataReads: Reads[Data] = (JsPath \ "entries").read[Seq[Entry]]

如果我修改数据以使其有多个字段。

case class Data(entries: Seq[Entry], someStr: String)

然后我使用组合器的dataReads编译得很好。

 implicit val dataReads: Reads[Data] = (
      (__ \ "entries").read[Seq[Entry]] and
      (__ \ "someStr").read[String]
    )(Data.apply _)

问题是我的Data并不真正需要String。

Play文档包含大量为Case类定义隐式读/写的示例,其中包含多个字段,但没有一个字段具有单个字段。

2 个答案:

答案 0 :(得分:0)

看看地图。

implicit val dataReads: Reads[Data] = (
        (__ \ "entries").read[Seq[Entry]].map(Data(_))
    )

如果您还需要定义Writes[T],您可能会对此信息感兴趣 - How to write a Play JSON writes converter for a case class with a single nullable member

答案 1 :(得分:0)

如果您使用乘法字段,则使用函数语法和FunctionalBuilder.apply函数,该函数填充Data.apply个参数:

implicit val dataReads: Reads[Data] = (... and ...)(Data.apply _)

是相同的

val dataBuilder: FunctionalBuilder[Reads]#CanBuild2[Seq[Entry], String] = (... and ...)

implicit val dataReads: Reads[Data] = dataBuilder(Data.apply _)

对于一个字段,不使用读取功能语法,因此您必须自己填充Data.apply参数,并将(__ \ "entries")映射到Data.entries

implicit val dataReads: Reads[Data] = (
  (__ \ "entries").read[Seq[Entry]].map(Data)
)