[英]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.