3

我是一个初学java程序员,所以如果我的问题有点愚蠢,我很抱歉。

我有一个如下所示的 JSON 对象:

{
"element1" : {
    "generated_name_1": {
        "a" : {"isReady":false}
    },
    "generated_name_2":{},
    "generated_name_3":{},
    "generated_name_4":{}
},
"element2" : {
    "generated_name_5" : {
        "a" : {"isReady":false},
        "g" : {"isReady":false}
    }
},
"element3" : { 
    "a" : { "isReady":false},
    "n":{}
}
}

我想检查并删除每个具有与之关联的空值的元素,例如“generated_name_2”和“n”。我不知道这些元素的名称是什么,也不知道它在 JSON 树中的嵌套程度。

我知道我必须编写一个递归程序,这就是我想出的:

public static void cleanJsonNodes(ObjectNode myJsonNode){
    for (JsonNode currentNode : myJsonNode){
        if (currentNode.size() == 0){
            myJsonNode.remove(currentNode);
        } else {
            cleanJsonNodes((ObjectNode)currentNode);
        }
    }
}

当然,这不起作用,但我真的不确定从这里去哪里,我已经在互联网上搜索无济于事。

请有人帮助我!

4

3 回答 3

3

我还没有测试过,但你可能想要这样的东西:

public static void stripEmpty(JsonNode node) {
    Iterator<JsonNode> it = node.iterator();
    while (it.hasNext()) {
        JsonNode child = it.next();
        if (child.isObject() && child.isEmpty(null))
            it.remove();
        else
            stripEmpty(child);
    }
}
于 2017-01-06T14:17:59.260 回答
2

我只想说明如何使用 Json 做到这一点:

JSONObject jsonObj = new JSONObject(_message);

    Map<String, JSONObject> map = jsonObj.getMap();

    Iterator<String> it = map.keySet().iterator();

    while(it.hasNext()){
          String key =   it.next();

          JSONObject o = map.get(key);

          if(o.length() == 0){
              it.remove();
          }
    }

JSONObject加载时它{}的长度为 0,因此您可以丢弃它。

作为旁注,您可以在递归中使用此方法,例如:

JSONObject jsonObj = new JSONObject(_message);

invoke(jsonObj);

...

private static void invoke(JSONObject jsonObj) {
    Map<String, JSONObject> map = jsonObj.getMap();

    Iterator<String> it = map.keySet().iterator();

    while(it.hasNext()){
        String key =   it.next();

        JSONObject o = map.get(key);

        if(o.length() == 0){
            it.remove();
        }
        else{
            invoke(o);
        }
    }
}

我没有添加任何验证,但可以肯定的是,您需要验证jsonObj.getMap()...的实例

于 2013-10-03T13:02:53.930 回答
1

检查这个

如何不在杰克逊发送空集合

对于 Json 中的空节点,您可以使用

http://jackson.codehaus.org/1.1.2/javadoc/org/codehaus/jackson/node/ObjectNode.html#remove(java.lang.String)

使用杰克逊删除 JSON 元素

这些可以解决你的问题。

于 2013-10-03T12:55:05.807 回答