【问题标题】:Compiler error Reads[T] for single path编译器错误 Reads[T] for single path
【发布时间】:2016-05-12 09:09:51
【问题描述】:

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

谁能指出我做错了什么?

我的模特:

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

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]]

如果我修改 Data 使其具有多个字段。

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

然后我使用组合器的 dataReads 编译正常。

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

问题是我的数据并不真正需要那个字符串。

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

【问题讨论】:

    标签: playframework playframework-2.0


    【解决方案1】:

    看看地图。

    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

    【讨论】:

      【解决方案2】:

      如果使用乘法字段,则使用函数式语法和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)
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多