GSON使用未知数量的对象解析Java

时间:2013-09-14 02:07:40

标签: java json gson

我是GSON的新手,在解析下面的JSON时遇到了问题。解析工作正常,直到它到达账单列表(盯着“0”:)。那时我在生成的gson.fromJson对象中得到一个空引用。如果这些账单是在JSON数组中指定的,我认为这很容易,但它们不是,我无法改变它。处理这种情况的最佳方法是什么?

{
"status":"OK",
"masterlist":{
    "session":{
        "session_id":1007,
        "session_name":"97th Legislature"
    },
    "0":{
        "bill_id":446875,
        "number":"HB4001"
    },
    "1":{
        "bill_id":446858,
         "number":"HB4002"
    },
    "2":{
        "bill_id":446842,
        "number":"HB4003"
    },...

这是我主要方法中的代码:

    InputStream source = retrieveStream(url);      
    Gson gson = new Gson();        
    Reader reader = new InputStreamReader(source);      
    ResponseData response = gson.fromJson(reader, ResponseData.class);

这是ResponseData类:

public class ResponseData {
private String status;
private MasterList masterlist;

public static class MasterList{
    private Session session;
    private Bill bill;   //Also tried: Map<String, String> bill;
}

public static class Session{
    private String session_id;
    private String session_name;
}

public static class Bill{
    private String bill_id;
    private String number;
}

}

1 个答案:

答案 0 :(得分:0)

您可以按如下方式映射对象:

声明一个要用json字符串

映射的对象
public class ResponseData {
private String status;

private Map<String, MasterList> masterlist;

public Map<String, MasterList> getMasterlist() {
    return masterlist;
}

public void setMasterlist(Map<String, MasterList> masterlist) {
    this.masterlist = masterlist;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public static class MasterList {
    private String session_id;

    private String session_name;

    private String bill_id;

    private String number;

    public String getSession_id() {
        return session_id;
    }

    public void setSession_id(String session_id) {
        this.session_id = session_id;
    }

    public String getSession_name() {
        return session_name;
    }

    public void setSession_name(String session_name) {
        this.session_name = session_name;
    }

    public String getBill_id() {
        return bill_id;
    }

    public void setBill_id(String bill_id) {
        this.bill_id = bill_id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}
}

使用如下:

String data = "{\"status\":\"OK\",\"masterlist\":{    \"session\":{        \"session_id\":1007,        \"session_name\":\"97th Legislature\"    },    \"0\":{        \"bill_id\":446875,        \"number\":\"HB4001\"    },    \"1\":{        \"bill_id\":446858,         \"number\":\"HB4002\"    },    \"2\":{        \"bill_id\":446842,        \"number\":\"HB4003\"    }}}";
        Gson gson = new Gson();         
        ResponseData response = gson.fromJson(data, ResponseData.class);

        for (Iterator<Entry<String, MasterList>> it = response.getMasterlist().entrySet().iterator(); it.hasNext(); ) {
            Map.Entry<String, MasterList> entry = it.next();
            System.out.println(entry.getKey());
System.out.println(entry.getValue().getSession_id());
        }