如何清理JSON中的空嵌套对象和空数组

3

I have a nested object such as:

{ 
  "name:"ABC",
  "nest1":{
     {
       "field1": null,
       "field2": null,
       "field3": [],
       "field4": {},
  },
  "nest2":{
       "field1":"123",
       "field2":null
  }
}

我想要清理这个 JSON,确保输出结果为:
{ 
  "name:"ABC",
  "nest2":{
       "field1":"123"
  }
}

我写了下面这段代码:

def withoutNullAndEmptyObj(json: JsValue): JsValue = {
  json match {
    case JsObject(fields) =>
      if (fields.isEmpty) JsNull
      else{
        fields.foldLeft(new JsObject(Map()))((agg, field) =>
          field match{
            case (_, JsNull) => agg
            case other@(name, value: JsArray) => if (value == emptyArray) agg else agg+other
            case (name, value: JsObject) => if (value == emptyObject) agg else agg+(name, withoutNullAndEmptyObj(value))
            case other@(name, value) => agg+other
          }
        )
      }
    case other => other
  }
}

事实上,它并没有完全工作。它将生成以下JSON:
{ 
  "name:"ABC",
  "nest1":{},
  "nest2":{
       "field1":"123"
  }
}

这还不够好。


创建一个新对象,仅将您想要的内容复制到其中? - T.J. Crowder
1个回答

5

通过对您当前代码做轻微的修改:

def withoutNullAndEmptyObj(json: JsValue): JsValue = {
  json match {
    case JsObject(fields) =>
      if (fields.isEmpty) JsNull
      else {
        fields.foldLeft(new JsObject(Map()))((agg, field) =>
          field match {
            case (_, JsNull)                    => agg
            case other @ (name, value: JsArray) => if (value == emptyArray) agg else agg + other
            case (name, value: JsObject) => {
              if (value == emptyObject) agg
              else {
                //added further check on else part.
                val nested = withoutNullAndEmptyObj(value);
                if (nested == emptyObject)
                  agg
                else
                  agg + (name, nested)
              }
            }
            case other @ (name, value) => agg + other
          })
      }
    case other => other
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接