json - 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 组合器是否可能?
解决方案
您可以通过创建两个案例类来执行以下操作。
case class Thing(param1: Option[BigDecimal])
case class ParentJson(parent: Option[Thing], param2: Option[BigDecimal])
推荐阅读
- java - 列表抛出 ConcurrentModificationException 传递给 CompletableFutures
- android - 如何从android中的BottomSheetDialogFragment调用片段
- python - 如何解决 django TypeError: __init__() got an unexpected keyword argument 'thread critical' 在 gitlab-ci 中的错误?
- c++ - 为什么 std::string 似乎做了 std::is_convertible 说不可能的事情?
- php - 从laravel中的外部api下载文件
- video-streaming - 使用 Locust 加载测试视频流
- ios - 如何在 Swift 5 中检查 3 个变量是否相等?
- opencv - 用于加载图像的 Mediapipe 自定义计算器
- reactjs - 对行进行排序后,Ag-grid 拖放不起作用
- mysql - JDBC ResultSet 是否支持分页?