如何递归地从JSON字符串中删除一些具有指定名称的字段?
例如,我想从以下JSON:中删除字段"secondName">
输入:
{
"name" : "abc",
"secondName": "qwe",
"add" : "abcd",
"moreDetails" : {
"secondName": "qwe",
"age" : "099"
}
}
输出:
{
"name" : "abc",
"add" : "abcd",
"moreDetails" : {
"age" : "099"
}
}
我必须从许多具有不同结构/模式的不同JSON中删除一些字段,因此我将无法对POJO进行反序列化/序列化。
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中的值类型?