Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala中的JSON对象空过滤_Json_Scala_Play Json - Fatal编程技术网

scala中的JSON对象空过滤

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

我在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.{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。