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>