web-dev-qa-db-fra.com

Analyse du tableau JSON dans 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 dans un Java.util.List...

Quelle est la manière la plus simple de faire ça?

98
Abel Callejo

Le moyen le plus simple consiste à utiliser la fonction d'analyse par défaut de Gson, fromJson().

Il existe une implémentation de cette fonction adaptée lorsque vous devez désérialiser en tout type ParameterizedType (par exemple, tout type List ), qui est fromJson(JsonElement json, Type typeOfT) .

Dans votre cas, il vous suffit d'obtenir le Type d'un List<String>, puis d'analyser le tableau JSON dans ce 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 est un JsonElement , mais il pourrait également s'agir d'un String , tout Reader ou un JsonReader .

Vous voudrez peut-être jeter un coup d’œil à la documentation de l’API Gson .

243
MikO

Le code ci-dessous utilise com.google.gson.JsonArray. J'ai imprimé le nombre d'éléments dans la liste ainsi que les éléments dans 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]
17
Prateek

J'ai lu la solution sur le site officiel de Gson à ici

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);
    }    

Résultat afficher sur le moniteur:

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1
4
Hoang

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

En exécutant le code - à l'étape 4 ci-dessous - par l'intermédiaire du débogueur, je suis en mesure de constater que l'objet List<ContentImage> mGalleryImages 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. Java classe avec la liste

public class FocusArea {

    @SerializedName("name")
    private String mName;

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

. Java classe 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);
    }
1
Gene Bo