播放Json:读取多个可选的嵌套对象

时间:2018-08-10 10:29:11

标签: json scala

我们有一个与下面类似的case类和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 _)

Json读取的Thing组合器将处理符合以下条件的传入Json:

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

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

我们可以使用诸如(__ \\ "param1")之类的递归读取来绕过此异常,但是理想情况下,我们希望保留显式路径,因为存在其他Json对象,这些对象在相同级别上具有相似的(即使不相同的)字段。

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

2 个答案:

答案 0 :(得分:1)

您可以通过以下两种方式创建两个案例类。
案例类Thing(param1:Option [BigDecimal])
案例类ParentJson(父母:Option [事物],param2:Option [BigDecimal])

答案 1 :(得分:0)

您可以将.readNullable[BigDecimal]替换为read(Reads.optionNoError[BigDecimal]),以将错误映射为“无”。