Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo analizar una clave JSON dinámica en un resultado anidado JSON?

Tengo un resultado de JSON en el formato siguiente que JSON Lint demuestra esto como "respuesta válida".

Mi pregunta es: ¿cómo acceder al contenido de "question_mark" ya que "141", "8911", etc son todos los valores dinámicos?

  • Cómo grabar llamadas telefónicas en android?
  • ¿Cómo puedo crear un certificado para mi Android Market APK?
  • MQTT Security - ¿Cómo evitar que los usuarios abusivos se suscriban a los temas?
  • No se pudo encontrar el contenedor gradle dentro de SDK de Android. Puede ser necesario actualizar su SDK de Android
  • Ocultar / mostrar programáticamente el teclado virtual de Android
  • Cómo obtener el nombre del tono en Android?
  • Mi código de ejemplo para acceder al valor de "producto".

    //Consider I have the first <code>JSONObject</code> of the "search_result" array and //I access it's "product" value as below. String product = jsonObject.optString("product"); //where jsonObject is of type JSONObject. //<code>product<code> now contains "abc". 

    JSON:

     { "status": "OK", "search_result": [ { "product": "abc", "id": "1132", "question_mark": { "141": { "count": "141", "more_description": "this is abc", "seq": "2" }, "8911": { "count": "8911", "more_desc": "this is cup", "seq": "1" } }, "name": "some name", "description": "This is some product" }, { "product": "XYZ", "id": "1129", "question_mark": { "379": { "count": "379", "more_desc": "this is xyz", "seq": "5" }, "845": { "count": "845", "more_desc": "this is table", "seq": "6" }, "12383": { "count": "12383", "more_desc": "Jumbo", "seq": "4" }, "257258": { "count": "257258", "more_desc": "large", "seq": "1" } }, "name": "some other name", "description": "this is some other product" } ] } 

    Mi pregunta título "clave dinámica" podría estar mal, pero no sé en este momento lo que es un mejor nombre para este problema.

    Cualquier ayuda sería muy apreciada!

  • Ejecución de bytecode Java en Android - Sun JVM en la parte superior de DalvikVM
  • ¿Cómo asegurar la cadena en la aplicación Android?
  • ¿Cómo puedo instalar adobe flash en el emulador de Android?
  • ¿Por qué no Service.onStop método?
  • FindFragmentById devuelve siempre null
  • Se necesita la guía compleja de diseño de la interfaz de usuario de Android (fragmentos)
  • 3 Solutions collect form web for “Cómo analizar una clave JSON dinámica en un resultado anidado JSON?”

    Utilice las claves JSONObject () para obtener la clave y luego iterar cada clave para obtener el valor dinámico.

    Aproximadamente el código se verá así:

     // searchResult refers to the current element in the array "search_result" JSONObject questionMark = searchResult.getJSONObject("question_mark"); Iterator keys = questionMark.keys(); while(keys.hasNext()) { // loop to get the dynamic key String currentDynamicKey = (String)keys.next(); // get the value of the dynamic key JSONObject currentDynamicValue = questionMark.getJSONObject(currentDynamicKey); // do something here with the value... } 

    Otra posibilidad es usar Gson (Nota, yo uso lombok aquí para generar getters / setters, toString, etc):

     package so7304002; import java.util.List; import java.util.Map; import lombok.AccessLevel; import lombok.Data; import lombok.NoArgsConstructor; import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; import com.google.gson.reflect.TypeToken; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class JsonDemo { @Data private static class MyMap { private int count; @SerializedName("more_description") private String moreDescription; private int seq; } @Data private static class Product { private String product; private int id; @SerializedName("question_mark") private Map<String, MyMap> questionMark; } @Data private static class MyObject { private String status; @SerializedName("search_result") private List<Product> searchResult; } private static final String INPUT = ""; // your JSON public static void main(final String[] arg) { final MyObject fromJson = new Gson().fromJson(INPUT, new TypeToken<MyObject>(){}.getType()); final List<Product> searchResult = fromJson.getSearchResult(); for (final Product p : searchResult) { System.out.println("product: " + p.getProduct() + "\n" + p.getQuestionMark()+ "\n"); } } } 

    Salida:

     product: abc {141=JsonDemo.MyMap(count=141, moreDescription=this is abc, seq=2), 8911=JsonDemo.MyMap(count=8911, moreDescription=null, seq=1)} product: XYZ {379=JsonDemo.MyMap(count=379, moreDescription=null, seq=5), 845=JsonDemo.MyMap(count=845, moreDescription=null, seq=6), 12383=JsonDemo.MyMap(count=12383, moreDescription=null, seq=4), 257258=JsonDemo.MyMap(count=257258, moreDescription=null, seq=1)} 

    Lo mismo también se puede hacer con GSON, pero en lugar de utilizar el adaptador convertidor GSON para convertir en POJO. Lo analizaremos manualmente. Lo que nos da flexibilidad en caso de datos JSON dinámicos.
    Digamos que el formato de JSON es como abajo en mi caso.

     { "dateWiseContent": { "02-04-2017": [ { "locality": " Cross Madian Cross Rd No 4" } ], "04-04-2017": [ { "locality": "Dsilva Wadi" }, { "locality": " Cross Madian Cross Rd No 4", "appointments": [] } ] } } 

    En este caso el dateWiseContent tiene claves de objeto dinámico por lo que analizaremos esta cadena json usando la clase JsonParser .

      //parsing string response to json object JsonObject jsonObject = (JsonObject) new JsonParser().parse(resource); //getting root object JsonObject dateWiseContent = jsonObject.get("dateWiseContent").getAsJsonObject(); 

    Obtener las claves dinámicas con Map.Entry<String, JsonElement> como se indica a continuación

      // your code goes here for (Map.Entry<String, JsonElement> entry : dateWiseContent.entrySet()) { //this gets the dynamic keys String dateKey = entry.getKey(); //you can get any thing now json element,array,object according to json. JsonArray jsonArrayDates = entry.getValue().getAsJsonArray(); int appointmentsSize = jsonArrayDates.size(); for (int count = 0; count < appointmentsSize; count++) { JsonObject objectData = jsonArrayDates.get(count).getAsJsonObject(); String locality = objectData.get("locality").getAsString(); } } 

    Similarmente cualquier nivel de json dinámico se puede analizar utilizando Map.Entry<String,JsonElement>

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.