2012-07-12 3 views
16

Po przeanalizowaniu łańcucha JSON w podanej w GSON klasie JsonObject (zakładam, że nie chcę analizować go w żadnych znaczących obiektach danych, ale ściśle chcę użyć JsonObject), w jaki sposób mogę zmodyfikować pole/wartość klucza bezpośrednio?Jak modyfikować wartości JsonObject/JsonArray bezpośrednio?

Nie widzę interfejsu API, który może mi pomóc.

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

Odpowiedz

38

dziwne, odpowiedź jest utrzymanie dodanie do tyłu nieruchomości. W połowie oczekiwałem metody setter. : S

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

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

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

Powinni nazwałem to putProperty. Czyniłbym to wyraźniejszym. Nie stwierdza też nic w dokumentacji, która zastępuje istniejące właściwości, ale myślę, że w przeciwnym razie nie byłaby poprawna. – clu

1

Innym rozwiązaniem byłoby deserializowania w java.util.Map, a potem po prostu zmodyfikować Java Map jak chciał. Oddziela to obsługę danych po stronie Java od mechanizmu transportu danych (JSON), w ten sposób wolę organizować mój kod: używając JSON do transportu danych, a nie jako zastępczą strukturę danych.

+0

Dziękuję, prawdopodobnie także dlatego, że nie ma żadnego setera. –

+0

"usuń()" - lub dodaj() ponownie, jeśli używasz wersji przedsprzedażnej 2 (nie wiesz dokładnie dokładnej wersji, ale widziałem różnicę między interfejsami 1.2.3 i 2.2.4). – orbfish

1

To wszystko w dokumentacji.
JSONObject i JSONArray mogą być użyte zarówno do zastąpienia standardowej struktury danych.
Aby zaimplementować setera, po prostu zadzwoń pod remove(String name) przed put(String name, Object value).

Oto prosty przykład:

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

Niewłaściwa biblioteka. Najpierw zastanawiałem się, gdzie do cholery masz metodę put(), wtedy zdałem sobie sprawę, że powiedziałeś JSONObject, czyli bibliotekę json.org, a nie JsonObject, wersję GSON. – orbfish

5

Od 2,3 wersja biblioteki Gson klasa JsonArray mieć „Ustaw” metody.

Oto prosty przykład:

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

Działa to na modyfikację wartości childkey korzystając JSONObject. import stosowany jest

import org.json.JSONObject; 

ex json (przekonwertować plik json ciąg dając jako wejście)

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

Kod

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

wyjściowa:

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

Użyj właściwego formatowania, aby było jasne i łatwe do odczytania. –

+0

Chciałem tylko podkreślić, że pytanie dotyczy com.google.gson.JsonObject, a nie org.json.JSONObject. Wybrana i najbardziej przegłosowana odpowiedź, na dole, wydaje się być poprawna – javaNoober