Análisis de la matriz JSON en java.util.List con Gson

Tengo un JsonObject llamado "mapping" con el siguiente contenido:

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

Sé que puedo obtener los "servers" la matriz con:

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

Y ahora quiero analizar ese JsonArray en java.util.List

¿Cuál es la forma más fácil de hacer esto?

Definitivamente la forma más fácil de hacerlo es usar la función de análisis predeterminado de Gson de fromJson() .

Hay una implementación de esta función adecuada para cuando necesita deserializar en cualquier tipo ParameterizedType (por ejemplo, cualquier List ), que es de fromJson(JsonElement json, Type typeOfT) .

En su caso, solo necesita obtener el Type de una List y luego analizar la matriz JSON en ese Type , así:

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

En su caso, su yourJson es un JsonElement , pero también podría ser un String , cualquier Reader o un JsonReader .

Es posible que desee echar un vistazo a la documentación de la API de Gson .

El código siguiente está usando com.google.gson.JsonArray . Imprimí la cantidad de elementos en la lista y los elementos en la Lista

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

SALIDA

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

Leí la solución del sitio web oficial de Gson aquí

Y este código para ti:

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

Resultado mostrado en el monitor:

 8.8.8.8 8.8.4.4 156.154.70.1 156.154.71.1 

Pude hacer que la asignación de listas funcionara con el uso de @SerializedName para todos los campos … no era necesaria ninguna lógica en torno al Type .

Ejecutando el código – en el paso # 4 a continuación – a través del depurador, puedo observar que el objeto List mGalleryImages con los datos JSON

Aquí hay un ejemplo:

1. El 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. Clase de Java con la lista

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

3. Clase de Java para los elementos de la lista

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

4. El código de Java que procesa el JSON

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

Mira esto, creo que esto es lo que necesitas.

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