【问题标题】:Parsing Data From JSON file to Java Object using GSON使用 GSON 将数据从 JSON 文件解析为 Java 对象
【发布时间】:2020-02-26 16:14:26
【问题描述】:

我有一个非常长的 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 对象的代码:

这是包含计数项的容器以及名为 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());
            }
        }

由于某种原因,它永远不会填满所有标签中的项目。我已经广泛研究了这个Parsing a complex Json Object using GSON in Java 问题,但我似乎找不到错误。下载这个超长 JSON 文件的链接在这里Really Long JSON File。如果您将页面保存为 .json,则它大约为 121MB,因此请注意。

提前谢谢你。如果需要任何其他信息,请告诉我

【问题讨论】:

  • 您是否尝试将Ingredients 对象中的items 变量更改为tags,使其与JSON 结构匹配?
  • @djointster gson 类是否需要准确的名称?只要变量类型匹配,我认为这并不重要
  • 这很重要,但可以用不同的名字来完成。
  • 非常感谢您的回答是正确的@djointster

标签: java json gson fromjson


【解决方案1】:

要使其自动运行,您需要将Ingredients.items 更改为Ingredients.tags

如果你想保持你的对象结构,你可以检查here如何使用自定义反序列化器或注释来做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多