Java-在没有POJO的情况下递归地从JSON字符串中删除字段



如何递归地从JSON字符串中删除一些具有指定名称的字段?

例如,我想从以下JSON:中删除字段"secondName">

输入:

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

输出:

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

我必须从许多具有不同结构/模式的不同JSON中删除一些字段,因此我将无法对POJO进行反序列化/序列化。

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

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

如果您了解架构和继承结构,可以执行以下操作:

JsonObject jsonObj= gson.fromJson(json, JsonObject.class); jsonObj.getAsJsonObject("moreDetails").remove("secondName"); System.out.println(jsonObj.getAsString());

有关更多信息,请参阅此从JsonObject 中的Json中删除密钥

否则,您需要编写一个动态函数,该函数将检查JSON对象的每个元素,并尝试在其中找到secondName元素并将其删除。

因此,考虑到这里有多个嵌套对象,那么您需要编写一个函数,该函数将迭代每个元素,并检查其类型,如果它再次是一个jsonObject递归或迭代地调用相同的方法来检查当前元素,在每次检查中,您还需要验证键,如果它与必须删除的密钥匹配,那么您可以删除它并继续执行相同的操作。

有关如何检查JSON的值类型的提示,请参阅如何检查JSONObject中的值类型?

最新更新