【问题标题】:Using GSON to parse a JSON file with keys and tab使用 GSON 解析带有键和选项卡的 JSON 文件
【发布时间】:2014-10-10 10:48:42
【问题描述】:

我有这个 json 结构:

{
    "itemname1": [
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        }
    ],
    "itemname2": [
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": false
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": false
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        }
    ],
    "itemname3": [
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": "http:\/\/url.com/something"
        },
        {
            "var1": "VALUE STRING",
            "var2": "http:\/\/url.com/something",
            "var3": "VALUE STRING",
            "var4": 123456,
            "var5": false
        }
    ]
}

我已经为解析 json 文件创建了一些对象:

ItemList.java

public class ItemList {
    List<Item> item;

    public List<Item> getItem() {
        return item;
    }

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

Item.java

public class Item {
    ItemTab [] itemTab;

    public ItemTab [] getItemTab() {
        return itemTab;
    }

    public void setItemTab(ItemTab [] itemTab) {
        this.itemTab = itemTab;
    }
}

ItemTab.java

public class ItemTab {
    List<ItemInfo> itemInfo;

    public List<ItemInfo> getItemInfo() {
        return itemInfo;
    }

    public void setItemInfo(List<ItemInfo> itemInfo) {
        this.itemInfo = itemInfo;
    }
}

ItemInfo.java

public class ItemInfo {
    String var1;
    String var2;
    String var3;
    Integer var4;
    String var5;

    public String getVar1() {
        return var1;
    }

    public void setVar1(String var1) {
        this.var1 = var1;
    }
    ...
}

还有解析部分:

try {
    GsonBuilder builder = new GsonBuilder();
    Gson gson = builder.create();

    HttpResponse streamData = Network.getData("http://urlofmyjson.com/file.json");

    if (streamData.getStatusLine().getStatusCode() == 200) {

        Reader reader = new InputStreamReader(streamData
                            .getEntity().getContent());

        return gson.fromJson(reader, ItemList.class);
    }
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (URISyntaxException e) {
    e.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
}

当我打电话给这条线时:

Log.e("RESULT", result.getItem().get(0).getItemTab()[0].getItemInfo().get(0).getVar1().toString());

我收到此错误:

java.lang.NullPointerException:尝试在空对象引用上调用接口方法“java.lang.Object java.util.List.get(int)”

添加:我还需要将“itemname”作为字符串检索,但我不知道该怎么做。

有人可以帮我解决这个问题吗?

谢谢

【问题讨论】:

  • 什么是结果?也许 getItem 返回 null ?
  • result 是解析函数返回的对象(ItemList)(通过这一行:“return gson.fromJson(reader, ItemList.class);”)。
  • @Skylive var4 是整数

标签: java android json parsing gson


【解决方案1】:

试试这两个类应该可以工作

public class ItemList
 {

    @JsonProperty("itemname1")
    private List<ItemName> itemname1 = new ArrayList<ItemName>();
    @JsonProperty("itemname2")
    private List<ItemName> itemname2 = new ArrayList<ItemName>();
    @JsonProperty("itemname3")
    private List<ItemName> itemname3 = new ArrayList<ItemName>();
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("itemname1")
    public List<ItemName> getItemname1() {
        return itemname1;
    }

    @JsonProperty("itemname1")
    public void setItemname1(List<ItemName> itemname1) {
        this.itemname1 = itemname1;
    }

    @JsonProperty("itemname2")
    public List<ItemName> getItemname2() {
        return itemname2;
    }

    @JsonProperty("itemname2")
    public void setItemname2(List<ItemName> itemname2) {
        this.itemname2 = itemname2;
    }

    @JsonProperty("itemname3")
    public List<ItemName> getItemname3() {
        return itemname3;
    }

    @JsonProperty("itemname3")
    public void setItemname3(List<ItemName> itemname3) {
        this.itemname3 = itemname3;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }





}


public class ItemName {

    @JsonProperty("var1")
    private String var1;
    @JsonProperty("var2")
    private String var2;
    @JsonProperty("var3")
    private String var3;
    @JsonProperty("var4")
    private Integer var4;
    @JsonProperty("var5")
    private String var5;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("var1")
    public String getVar1() {
        return var1;
    }

    @JsonProperty("var1")
    public void setVar1(String var1) {
        this.var1 = var1;
    }

    @JsonProperty("var2")
    public String getVar2() {
        return var2;
    }

    @JsonProperty("var2")
    public void setVar2(String var2) {
        this.var2 = var2;
    }

    @JsonProperty("var3")
    public String getVar3() {
        return var3;
    }

    @JsonProperty("var3")
    public void setVar3(String var3) {
        this.var3 = var3;
    }

    @JsonProperty("var4")
    public Integer getVar4() {
        return var4;
    }

    @JsonProperty("var4")
    public void setVar4(Integer var4) {
        this.var4 = var4;
    }

    @JsonProperty("var5")
    public String getVar5() {
        return var5;
    }

    @JsonProperty("var5")
    public void setVar5(String var5) {
        this.var5 = var5;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

【讨论】:

    【解决方案2】:

    这不起作用,因为 json 文件与您的类不同。

    gson 尝试解析 ItemList 类。它位于 json 的根目录中,因此只有 3 个字段:itemname1itemname2itemname3。你的班级只有ItemList,它有一个ItemTab 的数组,其中有一个ListItemInfo。它们都不适用于找到的属性,因此解析器什么也不做,而是返回一个没有实例化的实例。

    与您发布的 JSON 匹配的唯一类是 ItemInfo 类,其他类是不必要的。您需要创建另一个类(我将其称为MyJSon,但称它为更好的名称)并为您在 JSON 中的 3 个字段创建 getter 和 setter。应该是这样的:

    public class MyJSon{
    
    private ItemInfo[] itemname1;
    private ItemInfo[] itemname2;
    private ItemInfo[] itemname3;
    
    public void setItemname1(ItemInfo[] itemname1) {
        this.itemname1 = itemname1;
    }
    
    public void setItemname2(ItemInfo[] itemname2) {
        this.itemname2 = itemname2;
    }
    
    public void setItemname3(ItemInfo[] itemname3) {
        this.itemname3 = itemname3;
    }
    
    public ItemInfo[] getItemname1() {
        return itemname1;
    }
    
    public ItemInfo[] getItemname2() {
        return itemname2;
    }
    
    public ItemInfo[] getItemname3() {
        return itemname3;
    }
    
    }
    

    然后你返回这个类而不是ItemList,像这样:

     return gson.fromJson(reader, MyJson.class);
    

    【讨论】:

      猜你喜欢
      • 2013-04-28
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      相关资源
      最近更新 更多