我尝试删除任意JSON的所有节点,其值为'null'。
不知怎的,我在JsonPath上挣扎,因此我尝试使用以下代码迭代JSON:
public static Map<String, Object> toMap(JSONObject object) throws JSONException {
Map<String, Object> map = new HashMap<String, Object>();
Iterator<String> keysItr = object.keys();
while(keysItr.hasNext()) {
String key = keysItr.next();
Object value = object.get(key);
if(value instanceof JSONArray) {
value = toList((JSONArray) value);
}
else if(value instanceof JSONObject) {
value = toMap((JSONObject) value);
}
map.put(key, value);
if(value.toString().equalsIgnoreCase("NULL")) {
object.remove(key);
}
}
return map;
}
public static List<Object> toList(JSONArray array) throws JSONException {
List<Object> list = new ArrayList<Object>();
for(int i = 0; i < array.length(); i++) {
Object value = array.get(i);
if(value instanceof JSONArray) {
value = toList((JSONArray) value);
}
else if(value instanceof JSONObject) {
value = toMap((JSONObject) value);
}
list.add(value);
}
return list;
}
当我在我的JSON上运行它时,然后不会删除整个元素,因为括号保持不变。我也想知道,如果它可以工作,如果我在两个不同的地方有一个相同的密钥名称,但只想删除一个。
之前:{“interest”:[{“interestKey1”:“Dogs”},{“interestKey2”:“Cats”},{“interestKey3”:null}]}
之后:{“interest”:[{“interestKey1”:“Dogs”},{“interestKey2”:“Cats”},{}]}
我该如何处理?
答案 0 :(得分:1)
您要从JsonObject中删除键值对,而不是包含JsonArray。而JsonObject本身可以有几个键值对。因此,删除一个不会删除整个对象。
jsonObj={"a":"cde","b":"fgh"}
这是一个有效的jsonObject。当我删除&#34; b&#34;从jsonObj.remove("b")
开始,只有&#34; a&#34;仍为{"a":"cde"}
并删除&#34; a&#34;返回{}
因此,如果要从jsonArray中删除整个jsonObject,请直接从jsonArray中删除它。
在JsonArray中,你不能用键选择一个jsonObject,而是用它的索引选择。因此,即使它有两个具有相同键的JsonObject,您也必须通过其唯一索引选择一个。
答案 1 :(得分:0)
尝试处理对象的基本情况。 下面的代码可能有帮助:
public static Map<String, Object> toMap(JSONObject object) throws
JSONException {
if(object==null)return null;
Map<String, Object> map = new HashMap<String, Object>();
Iterator<String> keysItr = object.keys();
while(keysItr.hasNext()) {
String key = keysItr.next();
Object value = object.get(key);
if(value instanceof JSONArray) {
value = toList((JSONArray) value);
}
else if(value instanceof JSONObject) {
value = toMap((JSONObject) value);
}
if(null != value)
map.put(key, value);
if(null==value || value.toString().equalsIgnoreCase("NULL")) {
object.remove(key);
}
}
return map;
}