GSON没有填写对象列表

时间:2010-10-01 13:55:28

标签: java json gson

我尝试了几种解决方案,使用GSON解析JSON的结果总是出错。

我有以下JSON:

{
    "account_list": [
        {
            "1": {
                "id": 1,
                "name": "test1",
                "expiry_date": ""
            },
            "2": {
                "id": 2,
                "name": "test2",
                "expiry_date": ""
            }
        }
    ]
}

在我的Java项目中,我有以下结构:

public class Account{

    private int id;
    private String name;
    private String expiry_date;

    public Account()
    {
        // Empty constructor
    }

    public Account(int id, String name, String expiry_date)
    {    
        this.id = id;
        this.name = name;
        this.expiry_date = expiry_date;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getExpiryDate() {
        return expiry_date;
    } 
}

public class AccountList{
    private List <Account> account_list;

    public void setAccountList(List <Account> account_list) {
        this.account_list = account_list;
    }

    public List <Account> getAccountList() {
        return account_list;
    }
}

我要反序列化的是:

Data.account_list = new Gson().fromJson(content, AccountList.class);

最后我得到List只有一个元素和错误的值。你能指出我正在做错的事吗?

感谢。

1 个答案:

答案 0 :(得分:9)

您的javabean结构与JSON结构不匹配(或反之亦然)。 JSON中的account_list属性基本上包含一个带有单个对象的数组,该对象又包含不同的Account属性,似乎使用索引作为属性键。但Gson期待一个包含多个Account对象的数组。

为匹配您的javabean结构,JSON应如下所示:

{
    "account_list": [
        {"id": 1, "name": "test1", "expiry_date": ""},
        {"id": 2, "name": "test2", "expiry_date": ""}
    ]
}

如果无法更改JSON结构,则必须更改Javabean结构。但由于JSON结构本身没什么意义,因此很难给出适当的建议。 List<Map<Integer, Account>>课程中的List<Account>代替AccountList将适用于此。但是如果你想保持List<Account>,那么你需要创建一个自定义的Gson反序列化器。