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 仅包含一个元素且值错误。你能告诉我我做错了什么吗?
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的 javabean 结构与 JSON 结构不匹配(或反之亦然)。 JSON 中的
account_list
属性基本上包含一个带有 single 对象的数组,该对象又包含不同的Account
属性,似乎使用索引作为属性键。但 Gson 需要一个包含多个 Account 对象的数组。为了匹配您的 javabean 结构,JSON 应该如下所示:
如果您无法更改 JSON 结构,那么您必须更改 Javabean 结构。但由于 JSON 结构本身没有多大意义,因此很难给出适当的建议。使用
List
而不是AccountList
类中的List
可以实现此目的。但如果您想将其保留为List
,那么您需要创建一个自定义 Gson 反序列化器。Your javabean structure doesn't match the JSON structure (or the other way round). The
account_list
property in JSON basically contains an array with a single object which in turn contains differentAccount
properties, seemingly using an index as property key. But Gson is expecting an array with multipleAccount
objects.To match your javabean structure, the JSON should look like this:
If you can't change the JSON structure, then you have to change the Javabean structure. But since the JSON structure at its own makes little sense, it's hard to give an appropriate suggestion. A
List<Map<Integer, Account>>
instead ofList<Account>
inAccountList
class will work for this. But if you'd like to keep it aList<Account>
, then you need to create a custom Gson deserializer.