Cómo analizar JSON Array (no un objeto Json) en Android

90

Tengo problemas para encontrar una manera de analizar JSONArray. Se parece a esto:

[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"},...]

Sé cómo analizarlo si el JSON se escribió de manera diferente (en otras palabras, si me devolvieron el objeto json en lugar de una matriz de objetos). Pero es todo lo que tengo y tengo que ir con eso.

* EDITAR: Es un json válido. Hice una aplicación para iPhone usando este json, ahora necesito hacerlo para Android y no puedo resolverlo. Hay muchos ejemplos, pero todos están relacionados con JSONObject. Necesito algo para JSONArray.

¿Alguien puede darme alguna pista, un tutorial o un ejemplo?

Muy apreciado !

SteBra
fuente
1
Pruebe esto para ver si su json es válido json.parser.online.fr
An-droid
¿Está utilizando alguna biblioteca para analizar json? Use la biblioteca gson para el análisis de json.
nilkash
Es válido. Lo analicé en una aplicación que hice para un iPhone y está funcionando. Simplemente no sé cómo hacerlo en Android
SteBra
1
@nikash, sí, noté que podría usar gson. El único problema es que todos los ejemplos que encontré son para analizar un JSONObject, no JSONArray
SteBra
Publique el código que ha probado hasta ahora. Será útil dar una respuesta precisa en consecuencia.
Spring Breaker

Respuestas:

147

use el siguiente fragmento para analizar JsonArray.

JSONArray jsonarray = new JSONArray(jsonStr);
for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    String name = jsonobject.getString("name");
    String url = jsonobject.getString("url");
}

Espero eso ayude.

Vacaciones de primavera
fuente
solo una pregunta si jsonarray incluye números como [2]. [4] y que los números en el interior incluyen nuevamente una matriz, así que si quiero recuperar de especialmente, digamos que la matriz anidada en numérico [4] en código java debo escribir int i = 4 ???
BiggDawgg
@BiggDawgg: Me alegro de que te haya ayudado. Publique su pregunta en un hilo separado con datos JSON para que sea fácil para mí responder.
Spring Breaker
26

Solo daré un pequeño ejemplo de Jackson :

Primero cree un contenedor de datos que tenga los campos de la cadena JSON

// imports
// ...
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDataHolder {
    @JsonProperty("name")
    public String mName;

    @JsonProperty("url")
    public String mUrl;
}

Y analizar la lista de MyDataHolders

String jsonString = // your json
ObjectMapper mapper = new ObjectMapper();
List<MyDataHolder> list = mapper.readValue(jsonString, 
    new TypeReference<ArrayList<MyDataHolder>>() {});

Usar elementos de lista

String firstName = list.get(0).mName;
String secondName = list.get(1).mName;
vilpe89
fuente
¿Puede darme un ejemplo de cómo obtendría JSON como una cadena de la URL que tengo, por favor?
SteBra
1
El DefaultHttpClientmétodo de ejecución s es una llamada de bloqueo, por lo que debe realizarse en una tarea en segundo plano, solo para aclarar por qué está en una clase separada.
vilpe89
Me está dando un error sobre el constructor de HttpGetTask. "El constructor HttpGetTask (OnHttpGetCompletedListener) se refiere al tipo que falta OnHttpGetCompletedListener"
SteBra
1
¿Ha importado OnHttpGetCompletedListener? Asíimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89
1
Sí, ese era el problema ... Gracias por resolver mi problema :)
SteBra
20
public static void main(String[] args) throws JSONException {
    String str = "[{\"name\":\"name1\",\"url\":\"url1\"},{\"name\":\"name2\",\"url\":\"url2\"}]";

    JSONArray jsonarray = new JSONArray(str);


    for(int i=0; i<jsonarray.length(); i++){
        JSONObject obj = jsonarray.getJSONObject(i);

        String name = obj.getString("name");
        String url = obj.getString("url");

        System.out.println(name);
        System.out.println(url);
    }   
}   

Salida:

name1
url1
name2
url2
Maxim Shoustin
fuente
12

Crea una clase para contener los objetos.

public class Person{
   private String name;
   private String url;
   //Get & Set methods for each field
}

Luego deserialice de la siguiente manera:

Gson gson = new Gson();
Person[] person = gson.fromJson(input, Person[].class); //input is your String

Artículo de referencia: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/

Kevin Bowersox
fuente
Supongo que esta "entrada" sería la URL de ese json. ¿O es otra cosa?
SteBra
Ésta es una solución muy sencilla. Debería ser el aceptado en mi opinión
FabioC
6

@Stebra Vea este ejemplo. Esto puede ayudarte.

public class CustomerInfo 
{   
    @SerializedName("customerid")
    public String customerid;
    @SerializedName("picture")
    public String picture;

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

Y cuando obtenga el resultado; analizar así

List<CustomerInfo> customers = null;
customers = (List<CustomerInfo>)gson.fromJson(result, new TypeToken<List<CustomerInfo>>() {}.getType());
nilkash
fuente
1
La variable de resultado es su JSONArray String
nilkash
¿La variable de resultado sería la URL de la que necesito obtener json o json ya obtenido?
SteBra
con mucho, la solución más fácil
0x6C38
6

En este ejemplo, hay varios objetos dentro de una matriz json. Es decir,

Esta es la matriz json: [{"nombre": "nombre1", "url": "url1"}, {"nombre": "nombre2", "url": "url2"}, ...]

Este es un objeto: {"nombre": "nombre1", "url": "url1"}

Suponiendo que ha obtenido el resultado de una variable de cadena llamada jSonResultString:

JSONArray arr = new JSONArray(jSonResultString);

  //loop through each object
  for (int i=0; i<arr.length(); i++){

  JSONObject jsonProductObject = arr.getJSONObject(i);
  String name = jsonProductObject.getString("name");
  String url = jsonProductObject.getString("url");


}
TharakaNirmana
fuente
Estoy teniendo dificultades para obtener mi JSONstring de la URL. ¿Quizás podrías ayudar con eso?
SteBra
Gracias por desglosarlo con ejemplos, buena claridad
ryvianstyron
3

Ya se han mencionado algunas buenas sugerencias. Usar GSON es realmente útil, y para hacer la vida aún más fácil, puede probar este sitio web Se llama jsonschema2pojo y hace exactamente eso:

Le da su json y genera un objeto java que puede pegar en su proyecto. Puede seleccionar GSON para anotar sus variables, por lo que extraer el objeto de su json es aún más fácil.

TomCB
fuente
2

Ejemplo de carga desde servidor en mi caso ...

int jsonLength = Integer.parseInt(jsonObject.getString("number_of_messages"));
            if (jsonLength != 1) {
                for (int i = 0; i < jsonLength; i++) {
                    JSONArray jsonArray = new JSONArray(jsonObject.getString("messages"));
                    JSONObject resJson = (JSONObject) jsonArray.get(i);
                    //addItem(resJson.getString("message"), resJson.getString("name"), resJson.getString("created_at"));
                }

Espero que ayude

최봉재
fuente
ps "jsonObject.getString (" mensajes ")" tipo es jsonArray; La primera respuesta existente es que no se puede convertir la cadena a jsonArray; Lo estoy arreglando.
최봉재
-1

Cree una clase de Java POJO para los objetos en la lista así:

class NameUrlClass{
       private String name;
       private String url;
       //Constructor
       public NameUrlClass(String name,String url){
              this.name = name;
              this.url = url; 
        }
}

Ahora simplemente cree una Lista de NameUrlClass e inicialícela en una ArrayList así:

List<NameUrlClass> obj = new ArrayList<NameUrlClass>;

Puede usar almacenar la matriz JSON en este objeto

obj = JSONArray;//[{"name":"name1","url":"url1"}{"name":"name2","url":"url2"},...]
Devesh Pradhan
fuente
1
No está claro qué obj = JSONArray;se supone que debe hacer. ¿Qué hay JSONArrayen este contexto? ¿De dónde viene? ¿Cuál es el propósito de inicializar objcon a new ArrayList<NameUrlClass>, cuando lo reemplaza directamente después de todos modos?
Max Vollmer
-3

Publicación anterior, lo sé, pero a menos que haya entendido mal la pregunta, esto debería funcionar:

s = '[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"}]';
eval("array=" + s);
for (var i = 0; i < array.length; i++) {
for (var index in array[i]) {
    alert(array[i][index]);
}

}

Janus
fuente
-3
            URL url = new URL("your URL");
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream stream = connection.getInputStream();
            BufferedReader reader;
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            //setting the json string
            String finalJson = buffer.toString();

            //this is your string get the pattern from buffer.
            JSONArray jsonarray = new JSONArray(finalJson);
boyke purnomo
fuente