作为免责声明:我对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文本中可能缺少list (Seq),它是一个可选字段。
考虑到这一点,我就是这样写这一行的:
private implicit val messageReader = (
//...
(__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq()))
//...
)(B.create _)在编译时,我会得到以下错误:
错误:(!行!!列!)没有为SeqA类型找到Json反序列化器。尝试为此类型实现隐式读取或格式。
从我在this question中看到的情况来看,很明显,对于不是该语言一部分的每一种类型的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 _)但是,在同一行中仍然会出现相同的错误。
我觉得这里有一些简单而明显的问题,但我不知道是什么问题。
我该怎么解决这个问题?
发布于 2017-07-22 07:42:44
如果B.create接受单个参数,那么它的读取可以如下所示:
private implicit val messageReader : Reads[B] =
(__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq())).map(B.create)https://stackoverflow.com/questions/45240214
复制相似问题