首页 > 解决方案 > Play Json:读取多个可选嵌套对象

问题描述

我们有一个类似于下面的案例类和 Json 组合器:

case class Thing(param1: Option[BigDecimal],
                 param2: Option[BigDecimal])

object Thing {
  implicit val writes: Writes[Thing] = Json.writes[Thing]

  implicit val reads: Reads[Thing] = (
    (__ \ "parent" \ "param1").readNullable[BigDecimal] and
    (__ \ "param2").readNullable[BigDecimal]
    )(Thing.apply _)

Thing 的 Json 读取组合器将处理与以下匹配的传入 Json:

{ 
    "parent": {
        "param1: 1111.11
     },
    "param2": 2222.22
}

标准的 ReadNullable 在param1不存在时按我们的需要工作,从而导致创建Thing(None, 2222.22). 但是,该parent对象也是可选的,并且像上面那样显式读取路径会导致路径丢失异常(如果它不存在)。我们需要这个来产生一个Thing(None, 2222.22),就像该param1字段不存在一样。

我们可以使用递归读取,例如(__ \\ "param1")双向传递此异常,但理想情况下,我们希望保留显式路径,因为在同一级别有其他 Json 对象具有相似(如果不相同)的字段。

以这种方式使用 Json 组合器是否可能?

标签: jsonscala

解决方案


您可以通过创建两个案例类来执行以下操作。
case class Thing(param1: Option[BigDecimal])
case class ParentJson(parent: Option[Thing], param2: Option[BigDecimal])


推荐阅读