如何用Jackson删除Java中的空json节点?

时间:2013-10-03 12:45:21

标签: java json jackson

我是一名初学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);
        }
    }
}

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

请有人帮助我!

3 个答案:

答案 0 :(得分: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() ...

的实例

答案 1 :(得分:2)

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

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);
    }
}

答案 2 :(得分:1)