Разбор данных из файла JSON в объект Java с помощью GSON - PullRequest
0 голосов
/ 31 октября 2019

У меня есть этот очень длинный JSON-файл, который имеет такую ​​структуру

{
 "count":123456,
 "tags":[
         {
          "sameAs":["https://www.wikidata.org/wiki/Q11254"],
          "url":"https://world.openfoodfacts.org/ingredient/salt",
          "products":214841,
          "name":"Salt",
          "id":"en:salt"
         },
         {
          "url":"https://world.openfoodfacts.org/ingredient/sugar",
          "sameAs":["https://www.wikidata.org/wiki/Q11002"],
          "name":"Sugar",
          "id":"en:sugar",
          "products":184348
         },
          ...
        ]

Порядок внутренних теговых объектов не остается прежним, но я не думаю, что это создаст проблему. В настоящее время это код, который я использую для разбора этого объекта JSON:

Это контейнер, содержащий элемент count, а также список тегов с именем IngredientItem.

public class Ingredients {
    private int count;
    private List<IngredientItem>  items;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public List<IngredientItem> getItems() {
        return items;
    }

    public void setItems(List<IngredientItem> items) {
        this.items = items;
    }
}

Этокод для каждого тега:

public class IngredientItem {
    private List<String> sameAs;
    private String id;
    private String name;
    private String url;
    private int productNumber;

    public IngredientItem(List<String> sameAs, String id, String name, String url, int productNumber) {
        this.sameAs = sameAs;
        this.id = id;
        this.name = name;
        this.url = url;
        this.productNumber = productNumber;
    }

    public List<String> getSameAs() {
        return sameAs;
    }

    public void setSameAs(List<String> sameAs) {
        this.sameAs = sameAs;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public int getProductNumber() {
        return productNumber;
    }

    public void setProductNumber(int productNumber) {
        this.productNumber = productNumber;
    }

    @Override
    public String toString() {
        return "product number: " + getProductNumber() +
                "\n" + "name: " + getName() +
                "\n" + "id: " + getId() +
                "\n" + "same as: " + getSameAs() +
                "\n" + "url: " + getUrl();
    }
}

, и это мой основной код для его анализа.

        Gson gson = new Gson();

        FileReader fr = new FileReader("path\\to\\file\\ingredients.json");
        Ingredients ingredients = gson.fromJson(fr,Ingredients.class);

        if(ingredients.getItems() ==null){
            System.out.println("NULL");
        }else{
            for (IngredientItem item: ingredients.getItems()) {
                System.out.println(item.toString());
            }
        }

по какой-то причине он никогда не будет заполнять элементы из всех тегов. Я уже подробно рассмотрел этот синтаксический анализ сложного объекта Json с использованием GSON в Java , и я не могу найти ошибку. Ссылка для скачивания этого чрезвычайно длинного файла JSON находится здесь Really Long JSON File . Если вы сохраняете страницу в формате .json, она составляет около 121 МБ, поэтому просто запомните это.

Заранее спасибо. Если требуется какая-либо другая информация, пожалуйста, сообщите m

1 Ответ

0 голосов
/ 31 октября 2019

Чтобы оно было автоматическим, вам нужно изменить Ingredients.items на Ingredients.tags.

Если вы хотите сохранить структуру вашего объекта, вы можете проверить здесь как это сделатьс пользовательским десериализатором или аннотациями.

...