简体   繁体   English

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

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

I have this json structure : 我有这个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
        }
    ]
}

I have created some objects for parse json file : 我已经创建了一些对象来解析json文件:

ItemList.java 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 Item.java

public class Item {
    ItemTab [] itemTab;

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

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

ItemTab.java 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 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;
    }
    ...
}

And the parsing part : 和解析部分:

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

And when i call this line : 当我打电话这条线:

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

I receive this error : 我收到此错误:

java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference java.lang.NullPointerException:尝试在空对象引用上调用接口方法'java.lang.Object java.util.List.get(int)'

Add : I also need to retrieve the "itemname" as string but i don't know how to do that. 添加:我还需要检索“ itemname”作为字符串,但是我不知道该怎么做。

Somebody can help me to solve this problem ? 有人可以帮助我解决这个问题吗?

Thanks 谢谢

Try these two classes it should work 试试这两个类应该工作

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

}

This is not working because the json file is different from your classes. 这不起作用,因为json文件与您的类不同。

The gson tries to parse the ItemList class. gson尝试解析ItemList类。 It is in the root of your json, so there is only 3 fields: itemname1 , itemname2 and itemname3 . 它位于json的根目录中,因此只有3个字段: itemname1itemname2itemname3 Your class only has a List of Item , which has an array of ItemTab , which has a List of ItemInfo . 您的类只有一个Item List ,它具有一个ItemTab数组,该数组具有一个ItemInfo List None of them apply to the properties that were found, so the parser does nothing and return you an instance with nothing instantiated. 它们都不适用于找到的属性,因此解析器不执行任何操作,并向您返回未实例化任何实例的实例。

The only class that matches the JSON you posted is the ItemInfo class, the other ones are unnecessary. 与您发布的JSON匹配的唯一类是ItemInfo类,其他类则不必要。 You need to create another class (I'll call it MyJSon , but call it something better) and make getters and setters to the 3 fields you have in your JSON. 您需要创建另一个类(我将其MyJSon ,但要更好一些),并对JSON中的3个字段进行获取和设置。 It would be something like this: 就像这样:

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

}

Then you return this class instead of ItemList , like this: 然后,您返回此类而不是ItemList ,如下所示:

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

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

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