当前位置: 首页 > 知识库问答 >
问题:

如何删除与JacksonJava的空json节点?

壤驷穆冉
2023-03-14

我是一名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个答案

蒯慈
2023-03-14

看看这个

如何在jackson中不发送空集合

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

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

使用jackson删除JSON元素

这些可以解决你的问题。

贺宏富
2023-03-14

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

胥承
2023-03-14

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

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);
    }
}
 类似资料:
  • 输入: 如何删除列顺序中没有值的记录? 期望输出: 我当前的XSL只删除空节点 我似乎无法掌握模板匹配来删除整个“记录”标签。。。非常感谢你!

  • 问题内容: 我有一个像下面这样的json: 我只想将此JSON转换为其他JSON。我想从JSON中删除“ _ 元数据”和“ _some”节点。我正在使用JSON.NET。 问题答案: 我刚结束反序列化到JObject并递归地循环遍历以删除不需要的字段。这是那些有兴趣的人的功能。

  • 我知道这可能是一个重复,但仍然张贴我的问题,因为我找不到确切的答案我在寻找什么。我有一个json对象(或字符串)如下。 我将从RESTAPI测试中得到相同类型的响应,但是在每次调用之后,“timestamp”键将具有一个动态日期和时间值,该值与调用的时间有关。在这里,我使用JSONAssert将我的expect json与实际json作为一个整体进行比较。因为时间戳值不同,所以对我来说总是失败。

  • 我正在使用Firebase作为web应用程序。它是用纯Javascript编写的,不使用外部库。 我可以“推送”并使用“.on(”child_added“)”检索数据,但是“.remove()”不能按照它所说的方式工作。根据 API, “Firebase.remove()-删除此Firebase位置的数据。子位置的任何数据也将被删除。删除的效果将立即可见。” 然而,移除不是立即发生的;只有在整个脚

  • 问题内容: 尝试删除不为空的文件夹时,出现“访问被拒绝”错误。我尝试使用以下命令:。 删除/删除不为空的文件夹/目录的最有效方法是什么? 问题答案: 标准库参考:shutil.rmtree。 根据设计,在包含只读文件的文件夹树上失败。如果要删除该文件夹而不管它是否包含只读文件,请使用

  • 本文向大家介绍python如何删除列为空的行,包括了python如何删除列为空的行的使用技巧和注意事项,需要的朋友参考一下 1.摘要 dropna()方法,能够找到DataFrame类型数据的空值(缺失值),将空值所在的行/列删除后,将新的DataFrame作为返回值返回。 2.函数详解 函数形式:dropna(axis=0, how='any', thresh=None, subset=None