Analizzare l’array JSON in java.util.List con Gson

Ho un JsonObject denominato "mapping" con il seguente contenuto:

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

So che posso ottenere i "servers" dell’array con:

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

E ora voglio analizzare JsonArray in un java.util.List

Qual è il modo più semplice per farlo?

Sicuramente il modo più semplice per farlo è usare la funzione di analisi predefinita di fromJson() .

Esiste un’implementazione di questa funzione adatta a quando è necessario deserializzare in qualsiasi ParameterizedType (ad esempio, qualsiasi List ), che fromJson(JsonElement json, Type typeOfT) .

Nel tuo caso, devi solo ottenere il Type di un List e quindi analizzare l’array JSON in quel Type , in questo modo:

 import java.lang.reflect.Type; import com.google.gson.reflect.TypeToken; JsonElement yourJson = mapping.get("servers"); Type listType = new TypeToken>() {}.getType(); List yourList = new Gson().fromJson(yourJson, listType); 

Nel tuo caso yourJson è un JsonElement , ma potrebbe anche essere una String , qualsiasi Reader o JsonReader .

Si consiglia di dare un’occhiata alla documentazione di Gson API .

Sotto il codice viene utilizzato com.google.gson.JsonArray . Ho stampato il numero dell’elemento in elenco così come gli elementi in List

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

PRODUZIONE

 List size is : 4 List Elements are : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1] 

Ho letto la soluzione dal sito ufficiale di Gson qui

E questo codice per te:

  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 lstName = new ArrayList<>(); lstName = Arrays.asList(arrName); for (String str : lstName) { System.out.println(str); } 

Risultato mostra sul monitor:

 8.8.8.8 8.8.4.4 156.154.70.1 156.154.71.1 

Sono stato in grado di ottenere la mapping delle liste per lavorare usando solo @SerializedName per tutti i campi .. nessuna logica attorno a Type era necessaria.

Eseguendo il codice – al punto 4 sotto – attraverso il debugger, sono in grado di osservare che l’object List mGalleryImages popolato con i dati JSON

Ecco un esempio:

1. Il 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 con la lista

 public class FocusArea { @SerializedName("name") private String mName; @SerializedName("gallery") private List mGalleryImages; } 

3. Classe Java per gli elementi dell’elenco

 public class ContentImage { @SerializedName("description") private String mDescription; @SerializedName("photo_url") private String mPhotoUrl; // getters/setters .. } 

4. Il codice Java che elabora il JSON

  for (String key : focusAreaKeys) { JsonElement sectionElement = sectionsJsonObject.get(key); FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class); } 

Dai un’occhiata, credo che questo sia ciò di cui hai bisogno.

 public class Test { public static void main(String[] args) { // this part is just to create the JSON object in question, so I am sure you are already having it. JsonObject mappings = new JsonObject(); JsonElement e = new JsonPrimitive("127.0.0.1"); mappings.add("client", e); JsonArray servers = new JsonArray(); JsonElement s1 = new JsonPrimitive("8.8.8.8"); JsonElement s2 = new JsonPrimitive("8.8.4.4"); JsonElement s3 = new JsonPrimitive("156.154.70.1"); JsonElement s4 = new JsonPrimitive( "156.154.71.1"); servers.add(s1); servers.add(s2); servers.add(s3); servers.add(s4); mappings.add("servers", servers); // json creation ends. // split the resultant string based on comma and then convert the resultant array into a list. String[] split = mappings.get("servers").getAsJsonArray().toString().split(","); List myList = new ArrayList(); Collections.addAll(myList, split); // again the following part is to demonstrate that the strings were populated in the list. for(String l : myList){ System.out.println(l); } } }