Как пройти объект Gson, с несколькими уровнями массивов - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь получить параметры внутри jSon items>item>image>images>transparent, используя библиотеку Gson . Идея состоит в том, чтобы захватить transparent, transparent_blank и transparent_dark. Но я не знаю, как я могу получить эти значения, на данный момент я создал следующее:

Json

{ 
  "date_layout":"day-month-year",
  "lastupdate":1547596830,
    "items":[{
      "name":"Cleans Cuts",
      "featured":"true",
      "item":{
        "image":"http:www.domain.com/unwanted_image.jpg",
           "images":{
              "transparent":"http:www.domain.com/desired_image1.jpg",
              "transparent_blank":"http:www.domain.com/desired_image2.jpg",
              "transparent_dark":"http:www.domain.com/desired_image3.jpg"
             }
          }
    },
    {
      "name":"Cleans Cuts",
      "featured":"true",
      "item":{
        "image":"http:www.domain.com/unwanted_image.jpg",
           "images":{
              "transparent":"http:www.domain.com/desired_image1.jpg",
              "transparent_blank":"http:www.domain.com/desired_image2.jpg",
              "transparent_dark":"http:www.domain.com/desired_image3.jpg"
             }
          }
    }]
}

.MainActivity

public class MainActivity extends AppCompatActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

String url = "http://www.example.com/file.json";

Request request = new Request.Builder()
       .url(url)
       .build();

Response response = client.newCall(request).execute();
       if(response.isSuccessful()){
          String response_jSon = response.body().string();
          Gson gson = new Gson();
          Datos datosFinal = gson.fromJson(response_jSon, Datos.class);
              for (int i=0; i<datosFinal.items.size(); i++){
                Log.d("msg_2", datosFinal.items.get(i).name);
              }
}

И я могу получить доступ только к тем элементам, которые вы видите в журнале .MainActivity.

Объект класса для Json

Datos.java

public class Datos {
    public String date_layout;
    public Int lastupdate;
     List<items> items;
}

items.java

public class items {
    public String name;
}

Ответы [ 3 ]

0 голосов
/ 18 января 2019

json не очень чистый, я бы посоветовал вам переделать, как генерируется эта строка json, но если вы все еще хотите добиться получения этих значений без переделки json, вам нужно изменить свои Items класс до:

`public class items {
    public String name;
    public String featured;
    public Item item;
}` 

Затем вам нужно создать еще один класс с именем Item

`public class Item{
    public String image;
    public Image images;
}`

Вам также потребуется создать класс Image , например:

`public class Image {
    public String transparent;
    public String transparent_blank;
    public String transparent_dark;
}`

Затем вы можете записать эти значения в свой цикл:

`Datos datosFinal = gson.fromJson(response_jSon, Datos.class);
 for (int i=0; i<datosFinal.items.size(); i++){
        Log.d("msg_2", datosFinal.items.get(i).item.images.transparent);
        Log.d("msg_2", datosFinal.items.get(i).item.images.transparent_blank);
        Log.d("msg_2", datosFinal.items.get(i).item.images.transparent_dark);
}`

Хотя это может сработать, я настоятельно рекомендую вам переделать JSON и упростить его обслуживание.

0 голосов
/ 18 января 2019

вы должны использовать

public class items {
    public String name;
    @Expose(serialize = false, deserialize = false)
    public String featured;
    @Expose(serialize = false, deserialize = false)
    public item mItem;
}

public class item {
    @Expose(serialize = false, deserialize = false)
    public String image;
    @Expose(serialize = false, deserialize = false)
    public images mImages;
}

public class images {
    @Expose(serialize = false, deserialize = false)
    public String transparent;
    @Expose(serialize = false, deserialize = false)
    public String transparent_blank;
    @Expose(serialize = false, deserialize = false)
    public String transparent_dark;
}

Вы можете генерировать Pojo, используя http://www.jsonschema2pojo.org/

0 голосов
/ 18 января 2019

Вы должны создать следующий класс также для получения значений для transparent, transparent_blank и transparent_dark

Images.java
Item.java

Заменить этот класс:

public class Items{

private Item item;

private String name;

private String featured;

public Item getItem ()
{
    return item;
}

public void setItem (Item item)
{
    this.item = item;
}

public String getName ()
{
    return name;
}

public void setName (String name)
{
    this.name = name;
}

public String getFeatured ()
{
    return featured;
}

public void setFeatured (String featured)
{
    this.featured = featured;
}


}

Добавить этот класс:

public class Images{

private String transparent_blank;

private String transparent_dark;

private String transparent;

public String getTransparent_blank ()
{
    return transparent_blank;
}

public void setTransparent_blank (String transparent_blank)
{
    this.transparent_blank = transparent_blank;
}

public String getTransparent_dark ()
{
    return transparent_dark;
}

public void setTransparent_dark (String transparent_dark)
{
    this.transparent_dark = transparent_dark;
}

public String getTransparent ()
{
    return transparent;
}

public void setTransparent (String transparent)
{
    this.transparent = transparent;
}

}

Также добавьте этот класс:

public class Item {

private Images images;

private String image;

public Images getImages ()
{
    return images;
}

public void setImages (Images images)
{
    this.images = images;
}

public String getImage ()
{
    return image;
}

public void setImage (String image)
{
    this.image = image;
}
}    

Теперь вы получите значение, используя метод getter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...