web-dev-qa-db-fra.com

Comment itérer un JSONObject (gson)

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?",
}
12
Floyd

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("\"",""));
    }
   }
9
atish shimpi

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);
    }
2
Syed Mauze Rehan

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

2
Siddhesh Shirodkar

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.

1
Paul Benn

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.

0
Ted Xu