Java -递归地从JSON字符串中删除字段,而不使用POJO

aydmsdu9  于 4个月前  发布在  Java
关注(0)|答案(4)|浏览(61)

如何递归地从JSON字符串中删除具有指定名称的某些字段?
例如,我想从下面的JSON中删除字段“secondName”:
输入:

{
    "name" : "abc",
    "secondName": "qwe",
    "add" : "abcd",
    "moreDetails" : {
        "secondName": "qwe",
        "age" : "099"
    }
}

字符串
输出值:

{
    "name" : "abc",
    "add" : "abcd",
    "moreDetails" : {
        "age" : "099"
    }
}


我必须从许多不同的JSON中删除一些具有不同结构/模式的字段,所以我将无法将POJO转换为POJO/从POJO序列化。

bqujaahr

bqujaahr1#

如果你知道模式和层次结构,你可以像下面这样做:
第一个月
更多信息Remove key from a Json inside a JsonObject
否则,你需要写一个动态函数,它将检查JSON对象的每个元素,并尝试找到其中的secondName元素并将其删除。
因此,考虑到这里有多个嵌套对象,那么你需要编写一个函数,它将遍历每个元素并检查其类型,如果它再次是jsonObject,则递归地或迭代地调用相同的方法来检查当前元素,在每次检查中,你还需要验证键,如果它与必须删除的键匹配,那么你可以删除它并继续相同的操作。
有关如何检查JSON的值类型的提示,请参阅此How to check the type of a value from a JSONObject?

4ngedf3f

4ngedf3f2#

Gson将任何有效的Json转换为LinkedTreeMap,例如:

LinkedTreeMap<?,?> ltm = new Gson().fromJson(YOUR_JSON, LinkedTreeMap.class);

字符串
然后它只是做一些递归方法来做清理:

public void alterEntry(Entry<?, ?> e) {
    if(e.getValue() instanceof Map) {
        alterMap((Map<?, ?>) e.getValue());
    } else {
        if(e.getKey().equals("secondName")) { // hard coded but you see the point 
            e.setValue(null); // we could remove the whole entry from the map
                              // but it makes thing more complicated. Setting null
                              // achieves the same.
        }
    }
}

public void alterMap(Map<?,?> map) {
    map.entrySet().forEach(this::alterEntry);
}


使用方法:

alterMap(ltm);

mzaanser

mzaanser3#

您可以尝试将JSON存储为JSONObject,使用jsonObject.names()删除键,并使用jsonObject.remove(key)删除条目。

icnyk63a

icnyk63a4#

你可以在Jackson中使用JsonNode.findParents(String fieldName)方法轻松地完成这一任务。然后在每个父对象上调用ObjectNode.remove(String propertyName)。最后,你将得到一个JsonNode,其中删除了给定字段名称的所有字段。

String input = """
    {
        "name" : "abc",
        "secondName": "qwe",
        "add" : "abcd",
        "moreDetails" : {
            "secondName": "qwe",
            "age" : "099"
        }
    }
    """;

JsonNode baseNode = new JsonMapper().readTree(input);
List<JsonNode> parents = baseNode.findParents("secondName");
for (JsonNode parent : parents) {
    ((ObjectNode) parent).remove("secondName");
}

字符串

相关问题