2017-05-26 2 views
0

Ich versuche alle Knoten eines beliebigen JSON zu löschen, die den Wert 'null' haben.JSON-Knoten in Java entfernen

Irgendwie habe ich mit JsonPath kämpfte deshalb habe ich versucht, mit dem folgenden Code durch die JSON iterieren:

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

Wenn ich es über meine JSON laufen, dann wird der nicht das gesamte Element gelöscht wird, wie die Klammern bleibe. Auch ich frage mich, ob es funktionieren würde, wenn ich an zwei verschiedenen Stellen den gleichen Namen eines Schlüssels habe, aber nur einen entfernen möchte.

vor: { "Interesse": [{ "interestKey1": "Dogs"}, { "interestKey2": "Cats"}, { "interestKey3": null}]}

nach: { "Interessen": [{"interseKey1": "Hunde"}, {"interseKey2": "Katzen"}, {}]}

Wie soll ich das angehen?

Antwort

0

Sie entfernen das Schlüssel-Wert-Paar von JsonObject und nicht das einschließende JsonArray. Und ein JsonObject kann mehrere Schlüssel-Wert-Paare in sich haben. Das Löschen eines Objekts löscht nicht das gesamte Objekt.

jsonObj={"a":"cde","b":"fgh"} 

Dies ist ein gültiges jsonObject. wenn ich „b“ von ihm wie jsonObj.remove("b") löschen, nur „a“ bleibt {"a":"cde"} und „a“ kehrt {}

Daher löschen, wenn Sie die ganze JSONObject von jsonArray entfernen möchten, entfernen Sie es direkt von jsonArray.

Und in JsonArray können Sie nicht ein JsonObject mit Schlüssel und eher mit seinem Index auswählen. Daher müssen Sie, selbst wenn es zwei JsonObjects mit denselben Schlüsseln hat, einen nach ihrem eindeutigen Index auswählen.

0

Versuchen Sie, Base Case für Objekt zu behandeln. Es ist unter Code könnte Hilfe sein:

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