web-dev-qa-db-fra.com

Comment modifier les valeurs de JsonObject/JsonArray directement?

Une fois que j’ai analysé une chaîne JSON dans une classe JsonObject fournie par GSON (supposons que je ne souhaite pas l’analyser dans des objets de données significatifs, mais que j’aimerais strictement utiliser JsonObject), comment modifier un champ touche directement?

Je ne vois pas d'API qui pourrait m'aider. 

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

20
Oh Chin Boon

Étrangement, la réponse est de continuer à rajouter la propriété. Je m'attendais presque à une méthode setter. : S

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

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

System.out.println("After: " + obj.get("DebugLogId")); // now "YYY"
48
Oh Chin Boon

Ceci fonctionne pour modifier la valeur de la clé enfant en utilisant JSONObject. Import utilisé est

import org.json.JSONObject;

ex json: (convertit un fichier json en chaîne en donnant en entrée)

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

Code

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

sortie:

{
    "parentkey1": "name",
    "parentkey2": {
     "childkey": "data1"
    },
}
6
Dheeraj Konatham

Depuis la version 2.3 de la bibliothèque Gson, la classe JsonArray a une méthode 'set'.

Voici un exemple simple:

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"));
5
micaelgallego

Une autre approche consisterait à désérialiser en un Java.util.Map, puis à modifier simplement la Map Java comme souhaité. Cela sépare le traitement des données côté Java du mécanisme de transport de données (JSON), c'est pourquoi je préfère organiser mon code: utiliser JSON pour le transport de données et non comme une structure de données de remplacement.

1
Programmer Bruce

Tout est en fait dans la documentation. 
JSONObject et JSONArray peuvent tous deux être utilisés pour remplacer la structure de données standard.
Pour implémenter un setter, appelez simplement une remove(String name) avant une put(String name, Object value).

Voici un exemple simple:

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
Tim Armstrong-Ooi