繁体   English   中英

使用Play-JSON库解析对象序列

[英]Parsing an object-sequence with Play-JSON library

免责声明:我对Scala和一般的函数编程非常陌生。

我有以下课程:

case class A(
  field1: String,
  field2: DateTime
)

case class B(
  listOfStuff: Seq[A]
)

object A{
  def create(field1: String, field2: DateTime): A = A(field1, field2)
}

object B{
  def create(listOfStuff: Seq[A]): B = B(listOfStuff)
}

(之所以存在create()函数是因为在使用apply()时我的代码有时会出现问题。让我们忽略这一点,我怀疑它是否相关。)

我以JSON格式获取这些对象,然后尝试使用Play-JSON库解析它们。 一个重要方面是JSON文本中可能缺少列表( Seq ),这是一个可选字段。

考虑到这一点,这就是我写该行的方式:

private implicit val messageReader = (
    //...
    (__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq()))
    //...
)(B.create _)

编译时,出现以下错误:

错误:(!line !,!column!)没有找到Seq [A]类型的Json解串器。 尝试为此类型实现隐式的Reads或Format。

从我在这个问题中看到的结果来看,显然您需要为不属于该语言的每种类型T都具有一个Reads[T]implicit实例(或类似的东西,我是否提到过这一点?)

因此,我还在相同的范围内添加了一个辅助Reads[T] ,现在我的代码如下所示:

private implicit val messageReader = (
    (__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq()))
)(B.create _)

private implicit val anotherReader = (
    (__ \ "field1").read[String] and
    (__ \ "field2").read[String].map(org.joda.time.DateTime.parse)
)(A.create _)

但是,我仍然在同一行上得到相同的错误。

我觉得这里有一个非常简单明显的问题,但我不知道是什么问题。

我该如何解决?

如果B.create接受单个参数,则其读取如下所示:

private implicit val messageReader : Reads[B] =
  (__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq())).map(B.create)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM