【发布时间】:2021-03-21 15:16:30
【问题描述】:
我在 Scala (2.12.8) 中使用 play.api.libs.json 来处理一些 json 对象。例如,我有一个 JSON 字符串,如下所示:
{
"field1": null,
"field2": 23,
"field3": {
"subfield1": "a",
"subfield2": null
},
"field4": {
"subfield1": true,
"subfield2": {
"subsubfield1": null,
"subsubfield2": "45"
},
"field5": 3
}
}
我想过滤掉每个空字段或子字段。
这里解释:Play: How to remove the fields without value from JSON and create a new JSON with them
在做:
import play.api.libs.json.{ JsNull, JsObject, JsValue, Json }
val j = Json.parse(myJsonString).as[JsObject]
JsObject(j.fields.filterNot(t => withoutValue(t._2)))
def withoutValue(v: JsValue) = v match {
case JsNull => true
case _ => false
}
帮助我删除上层字段:在我的例子中,field1
但field3.subfield2 和field4.subfield2.subsubfield1 仍然存在。我想删除它们。另外我应该提到,并非每个子字段都可以同时为空。如果发生这种情况,我认为我们可以删除上层字段。如果field3.subfield1和field3.subfield2为空,我们可以删除field3。
知道如何在 Scala 中巧妙地做到这一点吗?
PS:想要的输出是:
{
"field2": 23,
"field3": {
"subfield1": "a"
},
"field4": {
"subfield1": true,
"subfield2": {
"subsubfield2": "45"
},
"field5": 3
}
}
【问题讨论】:
-
以后还需要它作为JsObject吗?您可以将其解析为甚至没有这些字段的案例类,或者这些可以为空的字段作为选项,缺失或空字段将被解析为无。