Usar GSON para analizar un JSON con “clave” y “valor” dynamics en Android

Actualmente estoy trabajando en un proyecto de Android que requiere que invoque un servicio web que me devolverá un archivo json. He estado usando la biblioteca GSON para analizar todo el archivo json y obtener un objeto JSON. Ha funcionado bien hasta que me he encontrado con esta información json que los campos clave son dynamics. Un ejemplo de este archivo es el siguiente:

{ "0": { "count":"5"}, "1": { "title":"...", "desc":"" }, "2": { "title":"...", "desc":"" }, "3": { "title":"...", "desc":"" }, "4": { "title":"...", "desc":"" }, "5": { "title":"...", "desc":"" }, "routes": { "route1":"...", "route3":"" }, } 

Puedo obtener el recuento basado en la identificación de la clave de “0”, pero no estoy seguro de cómo hago uso de este valor para obtener los otros objetos clave (ID de clave 1-5), que consisten en los datos que Lo necesitaba. Realmente apreciaré si alguien puede ayudarme en este asunto. Gracias.

El enfoque más sencillo que puedo pensar es simplemente tratar la estructura como un Map (de Map ).

Con Gson, esto es relativamente fácil de hacer, siempre que la estructura del Map sea ​​estáticamente conocida, cada twig de la raíz tiene la misma profundidad, y todo es una String .

 import java.io.FileReader; import java.lang.reflect.Type; import java.util.Map; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; public class GsonFoo { public static void main(String[] args) throws Exception { Gson gson = new Gson(); Type mapType = new TypeToken>>() {}.getType(); Map> map = gson.fromJson(new FileReader("input.json"), mapType); System.out.println(map); // Get the count... int count = Integer.parseInt(map.get("0").get("count")); // Get each numbered entry... for (int i = 1; i <= count; i++) { System.out.println("Entry " + i + ":"); Map numberedEntry = map.get(String.valueOf(i)); for (String key : numberedEntry.keySet()) System.out.printf("key=%s, value=%s\n", key, numberedEntry.get(key)); } // Get the routes... Map routes = map.get("routes"); // Get each route... System.out.println("Routes:"); for (String key : routes.keySet()) System.out.printf("key=%s, value=%s\n", key, routes.get(key)); } } 

Para un manejo más dynamic de la estructura del Map , sugiero cambiar a usar Jackson , en lugar de Gson, ya que Jackson deserializará cualquier objeto JSON de cualquier complejidad arbitraria en un Map Java, con solo una línea simple de código, y retendrá automáticamente los tipos de valores primitivos.

 import java.io.File; import java.util.Map; import org.codehaus.jackson.map.ObjectMapper; public class JacksonFoo { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); Map map = mapper.readValue(new File("input.json"), Map.class); System.out.println(map); } } 

Lo mismo se puede lograr con Gson, pero requiere docenas de líneas de código. (Además, Gson tiene otras deficiencias que hacen que valga la pena cambiar a Jackson).

Puede obtener los objetos clave individuales usando el conteo. Entonces obtendrías el objeto “1” y luego obtendrás sus objetos “título” y “desc”, luego el objeto “2”, etc.