scala中的JSON对象空过滤
我在Scala(2.12.8)中使用scala中的JSON对象空过滤,json,scala,play-json,Json,Scala,Play Json,我在Scala(2.12.8)中使用play.api.libs.json来处理一些json对象。例如,我有一个JSON字符串,如下所示: { “字段1”:空, “字段2”:23, “字段3”:{ “子字段1”:“a”, “子字段2”:空 }, “字段4”:{ “subfield1”:正确, “子字段2”:{ “子字段1”:空, “子领域2”:“45” }, “字段5”:3 } } 我想过滤掉所有空字段或子字段 如下文所述: 做: import play.api.libs.json.{JsNul
play.api.libs.json
来处理一些json对象。例如,我有一个JSON字符串,如下所示:
{
“字段1”:空,
“字段2”:23,
“字段3”:{
“子字段1”:“a”,
“子字段2”:空
},
“字段4”:{
“subfield1”:正确,
“子字段2”:{
“子字段1”:空,
“子领域2”:“45”
},
“字段5”:3
}
}
我想过滤掉所有空字段或子字段
如下文所述:
做:
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匹配{
case JsNull=>true
大小写=>false
}
帮助我删除上层字段:在我的例子中,field1
但是field3.子字段2
和field4.子字段2.子字段1
仍然存在。我想把它们去掉。我还应该提到,不是每个子字段都可以同时为null。如果发生这种情况,我想我们可以删除上层字段。如果field3.子字段1
和field3.子字段2
为空,我们可以删除field3
你知道如何在Scala中干净利落地做到这一点吗
PS:所需输出为:
{
“字段2”:23,
“字段3”:{
“子字段1”:“a”
},
“字段4”:{
“subfield1”:正确,
“子字段2”:{
“子领域2”:“45”
},
“字段5”:3
}
}
您需要执行递归解决方案。例如:
def removeNulls(jsObject: JsObject): JsValue = {
JsObject(jsObject.fields.collect {
case (s, j: JsObject) =>
(s, removeNulls(j))
case other if (other._2 != JsNull) =>
other
})
}
代码在上运行。输出与预期一致。以后是否需要将其作为JsObject?您可以将其解析为一个case类,该类甚至没有这些字段,或者这些字段作为选项可以为null,而缺少或为null的字段将被解析为None。