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?

  • Instalar muestra error en la consola: INSTALAR FALLA CONFLICTING PROVIDER
  • HttpURLConnection para enviar archivos de imagen, audio y video con el parámetro puede (String o Json String) Android
  • Gradle no incluye dependencias en pom.xml publicado
  • Visualización de imágenes de SDCard en un Widget de MarshMallow
  • Cómo deshabilitar el cambio de paisaje / retrato en una aplicación web para móviles (navegador de Android / iOS Mobile Safari)
  • Cómo eliminar la imagen de fondo estándar de ImageButton?
  • 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!

  • ¿Cómo financiar un proyecto de código abierto?
  • Detectar el oyente en el desplazamiento de mes en android times square
  • Uso del contexto para iniciar otra actividad
  • ¿Cómo transformar currentTimeMillis a un formato de fecha legible?
  • Android WebView: cómo gestionar los cambios de orientación
  • Impedir el clic de Android ImageVIew?
  • 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.