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

时间:2017-07-21 14:27:51

标签: json scala playframework playframework-2.4

作为免责声明:我对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反序列化器。   尝试为此类型实现隐式读取或格式。

从我在this question中看到的情况来看,显然你需要implicitReads[T]T个实例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 _) 而不是语言的一部分(或者某种东西)那样的,我是否提到了我对此的陌生?)

所以我在同一范围内添加了辅助ngOnInit(),我的代码现在看起来像这样:

{{1}}

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

我觉得这里有一些非常容易和明显的问题,但我无法弄清楚它是什么。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果if接受单个参数,则其读取内容如下:

B.create