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?
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 .
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]
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
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);
}