Extrayendo todos los valores de JSON anidado

Soy bastante nuevo en el analizador JSON y estoy tratando de extraer todo el conjunto de datos de la etiqueta "tamaños", es decir, extraer valores (pequeño, sí, xpequeño, NO, mediano y sí) del archivo JSON en un bucle anidado complejo pero no lo hace trabajo. Estoy usando GSON para analizar el archivo JSON y uso JAVA como lenguaje de programación

Así es como se ve el archivo JSON en general

{ response: "ok",
  prodinfo: {
    sizes: [ 
      { size:"small", 
        available: "yes"
      }, 
      { size:"xsmall", 
        available: "No"
      },
      { size:"Medium", 
        available: "yes"
      }
    ]
  }
}

Esto es lo que hice

int array = jsonParser14.parse(json14).getAsJsonObject().get("ProdInfo").getAsJsonObject().getAsJsonArray("sizes").size();
JsonArray sizes = (JsonArray) jsonParser15.parse(json15).getAsJsonObject().get("ProdInfo").getAsJsonObject().getAsJsonArray("sizes");
for (int i = 0; i <= array; i++) {
    String size = sizes.get(i).getAsString();
    System.out.println("data extracted are: " + size);
}

Su ayuda será apreciada. Gracias

preguntado el 22 de mayo de 12 a las 16:05

¿Has creado clases en las que almacenar esos datos? Si es así, no necesita un bucle. Hay muchas maneras de hacerlo, muéstranos lo que intentaste. -

Hola chicos. Acabo de agregar el analizador GSON y el bucle que he hecho. Cualquier idea será apreciada. -

2 Respuestas

Por lo general, trato esto haciendo una clase pública con campos obligatorios:

public class ProdSize {
    public String size;
    public String available;
}

public class ProdInfo {
    public ProdSize[] sizes;
}

public class Message {
    public String response;
    public ProdInfo prodinfo;
}

Y luego solo tengo que hacer esto en gson:

Gson gson = new GsonBuilder().create();
Message mess = gson.fromJson(theJsonString, Message.class);

Entonces, no tengo ningún ciclo que hacer para analizar el JSON. Directamente tengo mis tallas en

mess.prodinfo.sizes

Por ejemplo, puedes imprimirlos así.

for (int i=0; i<mess.prodinfo.sizes.length; i++) {
   ProdSize size = mess.prodinfo.sizes[i];
   System.out.println("Size " + size.size + " -> " + size.available);
}

contestado el 22 de mayo de 12 a las 17:05

Hola distroy. gracias por responder, pero sin embargo, no puedo extraer cada campo en tamaños de su idea. ¿Sería posible mostrarme cómo se hace eso? En este momento, cuando ejecuto el siguiente código, obtengo un resultado como "[Lgsonparser$ProdSize;@787171" JsonParser jsonParser = new JsonParser(); FileReader json = new FileReader("h:\\test.json"); JsonElement theJsonString = jsonParser.parse(json); Gson gson = new GsonBuilder().create(); Desorden de mensajes = gson.fromJson(theJsonString, Message.class); System.out.println(mess.prodinfo.sizes); } } } - sgamer

Completé mi respuesta con un bucle para mostrar cómo se puede iterar. - Denys Séguret

Muchas gracias. Muy apreciado - sgamer

Algo como:

var sizes = json.prodinfo.sizes;
for (item in sizes) {
    if (sizes.hasOwnProperty(item)) {
        var isAvailable = sizes[item].available;
        alert(isAvailable);
    }

}​

Ejemplo aquí: http://jsfiddle.net/nG88B/3/

Editar: Parece que primero necesita analizar el JSON. En cuyo caso (si es válido) puedes hacer:

var obj = JSON.parse(jsonStr);

contestado el 22 de mayo de 12 a las 16:05

OP está tratando de analizar en Java usando gson. - Denys Séguret

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.