2012-07-12 19 views
16

Sobald ich einen JSON-String in eine GSON bereitgestellten JsonObject-Klasse geparst habe (angenommen, dass ich es in keine sinnvollen Datenobjekte analysieren möchte, sondern ausschließlich JsonObject verwenden möchte), wie kann ich ein Feld/einen Wert ändern direkt von einem Schlüssel?Wie können die Werte von JsonObject/JsonArray direkt geändert werden?

Ich sehe keine API, die mir helfen kann.

https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/JsonObject.html

Antwort

38

Merkwürdigerweise ist die Antwort zurück, um die Eigenschaft zu halten hinzufügen. Ich habe halb erwartet eine setter Methode. : S

System.out.println("Before: " + obj.get("DebugLogId")); // original "02352" 

obj.addProperty("DebugLogId", "YYY"); 

System.out.println("After: " + obj.get("DebugLogId")); // now "YYY" 
+1

Sie sollten habe diese putProperty genannt. Hätte es klarer gemacht. Es wird auch nichts in der Dokumentation angegeben, dass dies vorhandene Eigenschaften ersetzt, aber ich denke, es wäre sonst nicht gültig Json. – clu

1

Ein weiterer Ansatz in eine java.util.Map deserialisieren wäre, und dann ändern Sie einfach die Java Map als wollte. Dadurch wird die Java-seitige Datenverarbeitung vom Datentransportmechanismus (JSON) getrennt, und ich bevorzuge es, meinen Code so zu organisieren, dass JSON für den Datentransport und nicht als Ersatzdatenstruktur verwendet wird.

+0

Danke, wahrscheinlich auch der Grund, warum es überhaupt keinen Setter gibt. –

+0

"remove()" - oder add() erneut, wenn Sie Pre-Version 2 verwenden (nicht sicher über die genaue Version, aber ich habe den Unterschied zwischen 1.2.3 und 2.2.4 APIs gesehen). – orbfish

1

Es ist eigentlich alles in der Dokumentation.
JSONObject und JSONArray können beide verwendet werden, um die Standarddatenstruktur zu ersetzen.
Um einen Setzer zu implementieren, rufen Sie einfach einen remove(String name) vor einem put(String name, Object value).

Hier ist ein einfaches Beispiel:

public class BasicDB { 

private JSONObject jData = new JSONObject; 

public BasicDB(String username, String tagline) { 
    try { 
     jData.put("username", username); 
     jData.put("tagline" , tagline); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public String getUsername() { 
    String ret = null; 
    try { 
     ret = jData.getString("username"); 
    } catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    return ret; 
} 

public void setUsername (String username) { 
    try { 
     jData.remove("username"); 
     jData.put("username" , username); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public String getTagline() { 
    String ret = null; 
    try { 
     ret = jData.getString("tagline"); 
    } catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    return ret; 
} 
+0

Falsche Bibliothek. Zuerst fragte ich mich, wo zur Hölle du eine put() -Methode hast, dann wurde mir klar, dass du JSONObject gesagt hast, welches die json.org-Bibliothek ist, nicht JsonObject, die GSON-Version. – orbfish

5

Seit Version 2.3 von Gson Bibliothek der JsonArray Klasse hat eine 'Set' Methode.

Hier ist ein einfaches Beispiel:

JsonArray array = new JsonArray(); 
array.add(new JsonPrimitive("Red")); 
array.add(new JsonPrimitive("Green")); 
array.add(new JsonPrimitive("Blue")); 

array.remove(2); 
array.set(0, new JsonPrimitive("Yelow")); 
4

Dies funktioniert mit JSONObject childkey Wert zum Modifizieren. Import verwendet wird, ist

import org.json.JSONObject; 

ex json: (JSON-Datei in einen String konvertieren, während als Input geben)

{ 
    "parentkey1": "name", 
    "parentkey2": { 
    "childkey": "test" 
    }, 
} 

-Code

JSONObject jObject = new JSONObject(String jsoninputfileasstring); 
jObject.getJSONObject("parentkey2").put("childkey","data1"); 
System.out.println(jObject); 

Ausgang:

{ 
    "parentkey1": "name", 
    "parentkey2": { 
    "childkey": "data1" 
    }, 
} 
+0

Verwenden Sie die richtige Formatierung, um sie übersichtlich und leicht lesbar zu machen. –

+0

wollte nur betonen, die Frage ist über com.google.gson.JsonObject und nicht org.json.JSONObject. Die ausgewählte und meist aktualisierte Antwort scheint am Ende richtig zu sein – javaNoober

Verwandte Themen