J'ai un JsonObject par exemple
JsonObject jsonObject = {"keyInt":2,"keyString":"val1","id":"0123456"}
Chaque JsonObject
contient un "id"
entrée, mais le nombre d'autres paires clé/valeur n'est PAS déterminé, donc je veux créer créer un objet avec 2 attributs:
class myGenericObject {
Map<String, Object> attributes;
String id;
}
Je veux donc que ma carte d'attributs ressemble à ceci:
"keyInt" -> 4711
"keyStr" -> "val1"
J'ai trouvé cette solution
Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
attributes.put(entry.getKey(), jsonObject.get(entry.getKey()));
}
mais les valeurs sont entourées de ""
"keyInt" -> "4711"
"keyStr" -> ""val1""
Comment obtenir les valeurs simples (4711
et "val1"
)?
Des données d'entrée:
{
"id": 0815,
"a": "a string",
"b": 123.4,
"c": {
"a": 1,
"b": true,
"c": ["a", "b", "c"]
}
}
ou
{
"id": 4711,
"x": false,
"y": "y?",
}
remplacer "" par un blanc.
Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
if (! nonProperties.contains(entry.getKey())) {
properties.put(entry.getKey(), jsonObject.get(entry.getKey()).replace("\"",""));
}
}
Comment créez-vous votre JsonObject? Votre code fonctionne pour moi. Considère ceci
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
...
...
...
try{
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("keyInt", 2);
jsonObject.addProperty("keyString", "val1");
jsonObject.addProperty("id", "0123456");
System.out.println("json >>> "+jsonObject);
Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
attributes.put(entry.getKey(), jsonObject.get(entry.getKey()));
}
for(Map.Entry<String,Object> att : attributes.entrySet()){
System.out.println("key >>> "+att.getKey());
System.out.println("val >>> "+att.getValue());
}
}
catch (Exception ex){
System.out.println(ex);
}
Et ça marche bien. Maintenant, je suis intéressé de savoir comment vous avez créé votre JSON?
Vous pouvez également essayer ceci (JSONObject)
import org.json.JSONObject;
...
...
...
try{
JSONObject jsonObject = new JSONObject("{\"keyInt\":2,\"keyString\":\"val1\",\"id\":\"0123456\"}");
System.out.println("JSON :: "+jsonObject.toString());
Iterator<String> it = jsonObject.keys();
while( it.hasNext() ){
String key = it.next();
System.out.println("Key:: !!! >>> "+key);
Object value = jsonObject.get(key);
System.out.println("Value Type "+value.getClass().getName());
}
}
catch (Exception ex){
System.out.println(ex);
}
Apportez simplement les modifications suivantes ...
Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
attributes.put(entry.getKey(), jsonObject.get(entry.getKey()).getAsString());
}
"getAsString" fera la magie pour vous
Les valeurs de votre carte sont JsonElement
s. Chaque fois que vous imprimez un JsonElement
(par exemple en utilisant un débogueur), sa méthode toString()
sera appelée - et comme un JsonElement
a de nombreuses classes d'implémentation, la l'implémentation par défaut toString
encapsule la valeur entre guillemets pour garantir un JSON correct. Pour obtenir la valeur sous la forme d'un String
normal et non enveloppé, il suffit d'appeler getAsString()
:
JsonElement elem;
// ...
String value = elem.getAsString();
Avec votre exemple:
Map<String, Object> attributes = new HashMap<String, Object>();
Set<Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
for(Map.Entry<String,JsonElement> entry : entrySet){
attributes.put(entry.getKey(), jsonObject.get(entry.getKey()).getAsString());
}
Notez qu'il existe de nombreuses autres méthodes que vous pouvez appeler sur un JsonElement
pour produire d'autres types.
Je ne sais pas trop pourquoi vous voulez faire une manipulation manuelle en premier lieu. Le décodage GSON laissera simplement ces paires clé/valeur absentes comme valeur par défaut (zéro, null). Et puis vous pouvez traiter comme vous le souhaitez.