【问题标题】:How do I remove empty json nodes in Java with Jackson?如何使用 Jackson 删除 Java 中的空 json 节点?
【发布时间】:2019-03-01 20:53:23
【问题描述】:

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

当然,这行不通,但我不确定从这里去哪里,我在互联网上搜索无济于事。

请有人帮助我!

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

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

    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】:

      我只想说明如何使用 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() 的实例...

      【讨论】:

        【解决方案3】:

        【讨论】:

        • 如果可能,请尝试在您的实际答案中包含链接中的一些信息,而不仅仅是提供链接,因为link rot 将导致此答案对于遇到此问题的未来用户失去所有价值寻求答案。
        • 谢谢我知道了,所以我要在这里添加细节
        猜你喜欢
        • 2021-04-30
        • 2016-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多