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
É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"
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"
},
}
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"));
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.
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;
}