130 votes

Analyse d'un tableau JSON dans une liste java.util.List avec Gson

J'ai un JsonObject nommé "mapping" avec le contenu suivant :

{
    "client": "127.0.0.1",
    "servers": [
        "8.8.8.8",
        "8.8.4.4",
        "156.154.70.1",
        "156.154.71.1"
    ]
}

Je sais que je peux obtenir le tableau "servers" avec :

mapping.get("servers").getAsJsonArray()

Et maintenant je veux analyser cette JsonArray en un java.util.List ...

Quel est le moyen le plus simple de le faire ?

303voto

MikO Points 12862

La façon la plus simple de le faire est d'utiliser la fonction d'analyse par défaut de Gson. fromJson() .

Il existe une implémentation de cette fonction qui convient lorsque vous avez besoin de désérialiser dans n'importe quelle ParameterizedType (par exemple, toute List ), qui est fromJson(JsonElement json, Type typeOfT) .

Dans votre cas, il vous suffit d'obtenir l'élément Type d'un List<String> et ensuite analyser le tableau JSON dans ce fichier Type comme ceci :

import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;

JsonElement yourJson = mapping.get("servers");
Type listType = new TypeToken<List<String>>() {}.getType();

List<String> yourList = new Gson().fromJson(yourJson, listType);

Dans votre cas yourJson es un JsonElement mais il peut aussi s'agir d'un String tout Reader ou un JsonReader .

Vous voudrez peut-être jeter un coup d'œil à Documentation de l'API Gson .

18voto

Prateek Points 2253

Le code ci-dessous utilise com.google.gson.JsonArray . J'ai imprimé le nombre d'éléments de la liste ainsi que les éléments de la liste.

import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class Test {

    static String str = "{ "+ 
            "\"client\":\"127.0.0.1\"," + 
            "\"servers\":[" + 
            "    \"8.8.8.8\"," + 
            "    \"8.8.4.4\"," + 
            "    \"156.154.70.1\"," + 
            "    \"156.154.71.1\" " + 
            "    ]" + 
            "}";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {

            JsonParser jsonParser = new JsonParser();
            JsonObject jo = (JsonObject)jsonParser.parse(str);
            JsonArray jsonArr = jo.getAsJsonArray("servers");
            //jsonArr.
            Gson googleJson = new Gson();
            ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class);
            System.out.println("List size is : "+jsonObjList.size());
                    System.out.println("List Elements are  : "+jsonObjList.toString());

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

SORTIE

List size is : 4

List Elements are  : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]

11voto

Hoang Points 197

J'ai lu la solution sur le site officiel de Gson à l'adresse suivante aquí

Et ce code pour vous :

    String json = "{"client":"127.0.0.1","servers":["8.8.8.8","8.8.4.4","156.154.70.1","156.154.71.1"]}";

    JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);
    JsonArray jsonArray = jsonObject.getAsJsonArray("servers");

    String[] arrName = new Gson().fromJson(jsonArray, String[].class);

    List<String> lstName = new ArrayList<>();
    lstName = Arrays.asList(arrName);

    for (String str : lstName) {
        System.out.println(str);
    }    

Le résultat s'affiche sur le moniteur :

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1

2voto

gnB Points 760

J'ai réussi à faire fonctionner le mappage de liste en utilisant simplement @SerializedName pour tous les champs aucune logique autour Type était nécessaire.

Exécution du code - à l'étape 4 ci-dessous - à travers le débogueur, je suis capable d'observer que la List<ContentImage> mGalleryImages objet rempli avec les données JSON

Voici un exemple :

1. Le JSON

   {
    "name": "Some House",
    "gallery": [
      {
        "description": "Nice 300sqft. den.jpg",
        "photo_url": "image/den.jpg"
      },
      {
        "description": "Floor Plan",
        "photo_url": "image/floor_plan.jpg"
      }
    ]
  }

2. Classe Java avec la liste

public class FocusArea {

    @SerializedName("name")
    private String mName;

    @SerializedName("gallery")
    private List<ContentImage> mGalleryImages;
}

3. Classe Java pour les éléments de la liste

public class ContentImage {

    @SerializedName("description")
    private String mDescription;

    @SerializedName("photo_url")
    private String mPhotoUrl;

    // getters/setters ..
}

4. Le code Java qui traite le JSON

    for (String key : focusAreaKeys) {

        JsonElement sectionElement = sectionsJsonObject.get(key);
        FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class);
    }

0voto

Étant donné que vous commencez avec mapping.get("servers").getAsJsonArray() si vous avez accès à Goyave Streams vous pouvez faire la phrase suivante :

List<String> servers = Streams.stream(jsonArray.iterator())
                              .map(je -> je.getAsString())
                              .collect(Collectors.toList());

Note StreamSupport ne sera pas en mesure de travailler sur JsonElement il est donc insuffisant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X