Как разобрать вложенный объект json с помощью запроса Get в модификации? - PullRequest
0 голосов
/ 08 мая 2020

Я хочу создать простое приложение, подобное Uber eats, в котором вы можете заказывать еду, и я хотел бы использовать объект json ниже, чтобы получить данные и привязать их к моему recyclerview с помощью метода get для модернизации. это ссылка на необработанный файл json: https://pastebin.com/raw/xGGjGVD9

{
"categories": {
  "01": {
    "image": "http://web.archive.org/web/20160530195530if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-fingerfoods2.jpg",
    "name": "Finger Foods"
},
  "02": {
    "image": "http://web.archive.org/web/20160530200622if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-westernsoup1.jpg",
    "name": "Western Soup"
},
  "03": {
    "image": "http://web.archive.org/web/20160530163903if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-easternsoup.jpg",
    "name": "Eastern Soup"
},
  "04": {
    "image": "http://web.archive.org/web/20160530143505if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-sandwich.jpg",
    "name": "Sandwich"
},
  "05": {
    "image": "http://web.archive.org/web/20160531085702if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-pizza.jpg",
    "name": "pizza"
},
  "06": {
    "image": "http://web.archive.org/web/20160530202100if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-pasta1.jpg",
    "name": "pasta"
},
  "07": {
    "image": "http://web.archive.org/web/20160530202109if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-chicken.jpg",
    "name": "Chicken"
},
  "08": {
    "image": "http://web.archive.org/web/20160531085955if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-fish.jpg",
    "name": "Fish"
},
  "09": {
    "image": "http://web.archive.org/web/20160531025351if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-vegetarian.jpg",
    "name": "Chinese Vegetarian"
},
  "10": {
    "image": "http://web.archive.org/web/20160530195451if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-delights.jpg",
    "name": "Medifoods Delights"
},
  "11": {
    "image": "http://web.archive.org/web/20160531054218if_/http://medifoods.my/wp-content/uploads/2015/03/cover-menu-snacks.jpg",
    "name": "Snacks"
   }
 }
}

То, что я сделал до сих пор: Я сделал 3 класса для извлечения данные из первого объекта с номером «01», но это всего лишь один объект, у меня есть еще 9 объектов, и если я создам новый класс для каждого объекта, у меня будет много классов. есть ли лучший способ проанализировать этот json объект, или мне нужно создать новый класс для каждого объекта.

public class Properties {

@SerializedName("categories")
private Categories categories;

public Properties(Categories categories) {
    this.categories = categories;
}

public Categories getCategories() {
    return categories;
}

второй класс:

public class Categories {

@SerializedName("01")
private Foods foods;

public Categories(Foods foods) {
    this.foods = foods;
}

public Foods getFoods() {
    return foods;
}

третий класс:

public class Foods {

private String image;
private String name;

public Foods(String image, String name) {
    this.image = image;
    this.name = name;
}

public String getImage() {
    return image;
}

public String getName() {
    return name;
}

MainActivivy:

private void getFoodProperties() {
    Call<Properties> getFood = foodAPI.getProperties();
    getFood.enqueue(new Callback<Properties>() {
        @Override
        public void onResponse(Call<Properties> call, Response<Properties> response) {
            if (!(response.isSuccessful())) {
                Log.d(TAG, "onResponse: "+ response.code());
                return;
            }

            Log.d(TAG, "onResponse: " + response.body());
            foods.add(response.body());

            String name = foods.get(0).getCategories().getFoods().getName();
            String image = foods.get(0).getCategories().getFoods().getImage();
            Log.d(TAG, "onResponse: " + name + "  " + image);

        }

Интерфейс API:

public interface FoodApi {

@GET("xGGjGVD9")
Call<Properties> getProperties();

}

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Так как у вас есть ключи Dynami c в списке внутри ответа JSON, вам нужно использовать карту для хранения категорий.

public class Properties {

    @SerializedName("categories")
    @Expose
    private Map<String, Foods> categories;

    public Map<String, Foods> getCategories() {
        return categories;
    }

    public void setCategories(Map<String, Foods> categories) {
        this.categories = categories;
    }
}

Вы можете перебирать карту категорий, которая будут иметь ключи как «01», «02», «03» и c и значение как объект Foods. Если вам нужен список с карты, вы можете сделать следующее

List<Foods> list = new ArrayList<Foods>(categories.values());
0 голосов
/ 08 мая 2020

Я думаю, что categories объект - это список food в json, попробуйте изменить свой класс категорий.

public class Categories {

    @SerializedName("01")
    private List<Foods> foods;

    public Categories(Foods foods) {
        this.foods = foods;
    }

    public List<Foods> getFoods() {
        return foods;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...