代码之家  ›  专栏  ›  技术社区  ›  Serhiy

GSON没有填写对象列表

  •  3
  • Serhiy  · 技术社区  · 14 年前

    我尝试过几种解决方案,用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);
    

    最后,我得到的列表只有一个元素,而且值错误。你能告诉我我做错了什么吗?

    谢谢。

    1 回复  |  直到 14 年前
        1
  •  9
  •   BalusC    14 年前

    您的JavaBean结构与JSON结构(或相反)不匹配。这个 account_list JSON中的属性基本上包含一个带有 单一的 依次包含不同 Account 属性,似乎使用索引作为属性键。但GSON期望一个具有多个 帐户 物体。

    为了匹配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 这门课有用。但如果你想保留它 列出<帐户> ,然后需要创建自定义GSON反序列化程序。