Este es mi json:

{
  "posts": [
    {    
      "id": "c200",
      "title": "erfan",
      "email": "erfan@gmail.com",
      "address": "xx-xx-xxxx,x - street, x - country",
      "gender" : "male",
  "attachments":[
  {
    "url":"http://memaraneha.ir/wp-content/uploads/2016/11/light.jpg"
  }]},
  {
    "id": "c201",
    "name": "Johnny Depp",
    "email": "johnny_depp@gmail.com",
    "address": "xx-xx-xxxx,x - street, x - country",
    "gender" : "male",
    "attachments":[
    {
      "url":"http://memaraneha.ir/wp-content/uploads/2016/11/renovate-old-home.jpg"}]
    }]
}

Quiero obtener el title y url dentro de la matriz attachments. Lo he intentado hasta ahora.

try {
    JSONObject jsonObj = new JSONObject(jsonStr);
    jsonContent jsonContent = new jsonContent(); //my class 

    JSONArray posts = jsonObj.getJSONArray("posts");

    for (int i = 0; i < posts.length(); i++) {
        JSONObject c = posts.getJSONObject(i);
        jsonContent.title = c.getString("title");

        JSONArray attachments=c.getJSONArray("attachments");

        for (int j=0;j<attachments.length();j++) {
            JSONObject a=attachments.getJSONObject(j);                     
            jsonContent.imgurl=a.getString("url");
        }

        listcontent.add(jsonContent);    //mylist
    }
} catch(Exception e) {}

Luego muestro el title y el url en un TextView, ImageView dentro de un RecyclerView. En la tarjeta 1, muestro el primer título y la imagen del json analizado que funciona bien. Pero el problema está en la tarjeta 2, que muestra el título y la imagen de la tarjeta1 y no importa cuántos datos json tengamos, solo muestra ese mismo título e imagen en todos los elementos de mi RecyclerView.

Aquí está el POJO para analizar la respuesta de Json.

public class jsonContent {
    public String title;
    public String imgurl;
}
1
Erfan 15 dic. 2016 a las 20:17

2 respuestas

La mejor respuesta

Necesita crear un nuevo objeto jsonContent en cada bucle porque actualmente solo está cambiando los valores del mismo objeto en cada iteración y agregándolo a la lista.

 jsonContent jsonContent=null; //my class 

    JSONArray posts = jsonObj.getJSONArray("posts");
    for (int i = 0; i < posts.length(); i++) {
        jsonContent=new jsonContent(); //my class 
        //          ^^^^^^^^  create new object   
        JSONObject c = posts.getJSONObject(i);
        jsonContent.title=c.getString("title");

        JSONArray attachments=c.getJSONArray("attachments");
        for (int j=0;j<attachments.length();j++)
        {
            JSONObject a=attachments.getJSONObject(j);                     
            jsonContent.imgurl=a.getString("url");
        }
        listcontent.add(jsonContent);    //mylist
   }

Mejora: use la función getter y setter en lugar de exponer sus campos de clase como públicos

1
Pavneet_Singh 15 dic. 2016 a las 17:25

Sugeriría usar Gson para analizar su cadena json. Es limpio y fácil de usar.

En su caso, es posible que deba crear estas clases.

public class jsonContent {
    public String id;
    public String title;
    public String email;
    public String address;
    public String gender;
    public Attachment[] attachments;
}

public class Attachment {
    public String[] url;
}

Ahora que se crea su POJO, ahora está configurado para usar Gson para analizar la cadena json que obtuvo allí.

Gson gson = new Gson();
jsonContent[] postArray = gson.fromJson(jsonStr, jsonContent[].class);

Ahora pase este postArray a su adaptador e itere a través de la matriz para mostrar los datos adecuados en su TextView y ImageView en cada elemento de su RecyclerView.

Para agregar Gson en su proyecto de Android, solo tiene que agregar la siguiente dependencia en su build.gradle.

dependencies {
    compile 'com.google.code.gson:gson:2.4'
}
0
Reaz Murshed 15 dic. 2016 a las 18:00