我们有一个与下面类似的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组合器是否有可能?
答案 0 :(得分:1)
您可以通过以下两种方式创建两个案例类。
案例类Thing(param1:Option [BigDecimal])
案例类ParentJson(父母:Option [事物],param2:Option [BigDecimal])
答案 1 :(得分:0)
您可以将.readNullable[BigDecimal]
替换为read(Reads.optionNoError[BigDecimal])
,以将错误映射为“无”。