tutorialspoint studio recibir parser getjsonarray example datos consumir array java android json

java - studio - save json android



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

Tengo un resultado JSON en el siguiente formato, que JSON Lint muestra como "Respuesta válida".

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

Mi código de muestra 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" } ] }

El título de mi pregunta "clave dinámica" podría estar equivocado, pero no sé en este momento cuál es el mejor nombre para este problema.

¡Cualquier ayuda sería muy apreciada!


Otra posibilidad es usar Gson (Nota, 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)}


Un ejemplo de uso de Google Gson

Datos JSON de la pregunta:

{ "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" } ] }

Código de ejemplo:

import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; public class GsonExercise { public static void main(String[] args) { String jsonString = "{/"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/"}]}"; JsonObject jobj = new Gson().fromJson(jsonString, JsonObject.class); JsonArray ja = jobj.get("search_result").getAsJsonArray(); ja.forEach(el -> { System.out.println("product: " + el.getAsJsonObject().get("product").getAsString()); JsonObject jo = el.getAsJsonObject().get("question_mark").getAsJsonObject(); jo.entrySet().stream().forEach(qm -> { String key = qm.getKey(); JsonElement je = qm.getValue(); System.out.println("key: " + key); JsonObject o = je.getAsJsonObject(); o.entrySet().stream().forEach(prop -> { System.out.println("/tname: " + prop.getKey() + " (value: " + prop.getValue().getAsString() + ")"); }); }); System.out.println(""); }); } }

Salida:

product: abc key: 141 name: count (value: 141) name: more_description (value: this is abc) name: seq (value: 2) key: 8911 name: count (value: 8911) name: more_desc (value: this is cup) name: seq (value: 1) product: XYZ key: 379 name: count (value: 379) name: more_desc (value: this is xyz) name: seq (value: 5) key: 845 name: count (value: 845) name: more_desc (value: this is table) name: seq (value: 6) key: 12383 name: count (value: 12383) name: more_desc (value: Jumbo) name: seq (value: 4) key: 257258 name: count (value: 257258) name: more_desc (value: large) name: seq (value: 1)


Use las teclas JSONObject () para obtener la clave y luego itere cada tecla 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... }


Lo mismo se puede hacer usando GSON, pero en lugar de usar el adaptador de convertidor GSON para convertirlo a POJO. lo analizaremos manualmente lo que nos da flexibilidad en caso de datos JSON dinámicos.
digamos que el formato JSON es el siguiente 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, dateWiseContent tiene claves de objeto dinámico, por lo que analizaremos esta cadena json utilizando 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 usando 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(); } }

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