繁体   English   中英

使用GSON解析具有键和制表符的JSON文件

[英]Using GSON to parse a JSON file with keys and tab

我有这个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”作为字符串,但是我不知道该怎么做。

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

谢谢

试试这两个类应该工作

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);
    }

}

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

gson尝试解析ItemList类。 它位于json的根目录中,因此只有3个字段: itemname1itemname2itemname3 您的类只有一个Item List ,它具有一个ItemTab数组,该数组具有一个ItemInfo List 它们都不适用于找到的属性,因此解析器不执行任何操作,并向您返回未实例化任何实例的实例。

与您发布的JSON匹配的唯一类是ItemInfo类,其他类则不必要。 您需要创建另一个类(我将其MyJSon ,但要更好一些),并对JSON中的3个字段进行获取和设置。 就像这样:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM