Soy un novato en Android y tengo un archivo JSON con una clave dinámica como esta:
{ "x": { "a": { "1": [1,2,3,4], "2": [1,2,3,4] }, "b": { "1": [1,2,3,4], "2": [1,2,3,4] } }, "y": { "a": { "1": [1,2,3,4], "2": [1,2,3,4] }, "b": { "1": [1,2,3,4], "2": [1,2,3,4] } }, "z": { "a": { "1": [1,2,3,4], "2": [1,2,3,4] }, "b": { "1": [1,2,3,4], "2": [1,2,3,4] } } }Lo analicé con éxito por JSONObject pero tengo que recorrer las teclas Iterator en x, y, z. Para cada vez, tengo que hacer un bucle en a, b y lo mismo para "1" y "2". Creo que no es una buena solución. Creé modelos para ellos así:
Class XYZ { private String name; // "x", "y", "z" value private ArrayList<ABC> abcList; } Class ABC { private String name; // "a", "b", "c" private ArrayList<Item> itemList; } Class Item{ private String ID; // "1", "2" private int[] valueArray; }¿Alguien puede ayudarme a analizar este json de Gson? Creo que se ve más profesional: D. Muchas gracias
Sus modelos no pueden mapear su JSON solo porque la configuración predeterminada de Gson claramente los hace incomparables.
Puede tener dos formas "predeterminadas":
... ya que realmente no mencionaste por qué tu JSON se considera dinámico:
final class XYZ { final ABC x = null; final ABC y = null; final ABC z = null; } final class ABC { final OneTwo a = null; final OneTwo b = null; } final class OneTwo { @SerializedName("1") final List<Integer> one = null; @SerializedName("2") final List<Integer> two = null; }Ejemplo:
try ( final Reader reader = getPackageResourceReader(Q43695739.class, "dynamic.json") ) { final XYZ xyz = gson.fromJson(reader, XYZ.class); System.out.println(xyz.xbtwo); }... asumiendo que sus claves son dinámicas, pero la estructura sigue siendo la misma:
private static final Type stringToStringToStringToIntegerListType = new TypeToken<Map<String, Map<String, Map<String, List<Integer>>>>>() { }.getType(); try ( final Reader reader = getPackageResourceReader(Q43695739.class, "dynamic.json") ) { final Map<String, Map<String, Map<String, List<Integer>>>> m = gson.fromJson(reader, stringToStringToStringToIntegerListType); System.out.println(m.get("x").get("b").get("2")); } Otro verdadero enfoque dinámico que puede ser útil para algunos escenarios. También tenga en cuenta que JSONObject no está en el reino de Gson: probablemente haya importado este del paquete org.json . Gson usa nombres en mayúsculas y minúsculas como JsonElement , JsonObject , etc.
try ( final Reader reader = getPackageResourceReader(Q43695739.class, "dynamic.json") ) { final JsonElement jsonElement = gson.fromJson(reader, JsonElement.class) .getAsJsonObject() .getAsJsonObject("x") .getAsJsonObject("b") .getAsJsonArray("2"); System.out.println(jsonElement); } El primer y el segundo ejemplo producen instancias java.util.List
[1, 2, 3, 4]
El tercer ejemplo devuelve una instancia de JsonArray con una implementación toString ligeramente diferente:
[1,2,3,4]