首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Play-JSON库解析对象序列

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

Stack Overflow用户
提问于 2017-07-21 14:27:50
回答 1查看 556关注 0票数 0

作为免责声明:我对Scala和函数式编程非常陌生。

我有以下课程:

代码语言:javascript
复制
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),它是一个可选字段。

考虑到这一点,我就是这样写这一行的:

代码语言:javascript
复制
private implicit val messageReader = (
    //...
    (__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq()))
    //...
)(B.create _)

在编译时,我会得到以下错误:

错误:(!行!!列!)没有为SeqA类型找到Json反序列化器。尝试为此类型实现隐式读取或格式。

从我在this question中看到的情况来看,很明显,对于不是该语言一部分的每一种类型的T,您都需要一个Reads[T]implicit实例(或者类似的东西,我是否提到过我对此很陌生?)

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

代码语言:javascript
复制
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 _)

但是,在同一行中仍然会出现相同的错误。

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

我该怎么解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2017-07-22 07:42:44

如果B.create接受单个参数,那么它的读取可以如下所示:

代码语言:javascript
复制
private implicit val messageReader : Reads[B] =
  (__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq())).map(B.create)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45240214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档