【发布时间】:2015-10-14 00:34:33
【问题描述】:
我是 JSON 新手,与我研究过的任何其他解析方法相比,我喜欢 GSON Api 的强大和直接。
我想解析一个相当复杂的 JSON(使用 GSON),它在结构上类似于以下 JSON:
[
{
"name": "Steve",
"age": 42,
"description": null,
"email1": "steve@example.com",
"email2": null,
"address1": {
"type": "home",
"shippingMethod": "Charge by quantity",
"street": "Sunrise Ave",
"streetNo": 17
},
"address2": {
"type": "office",
"shippingMethod": null,
"street": "Sunset Ave",
"streetNo": 71
},
"anotherField": "another value"
},
{
"name": "Johnny",
...
"anotherField": "some other value"
}
]
我可以看到我需要用一个客户端对象数组来包装它,因为我的 JSON 以“[”开头,而且我还可以看到我需要另一个容器类用于内部字段 address1 和 address2。这是我想出的容器:
public class Client {
String name;
int age;
String description;
String email1;
String email2;
ClientAddress address1;
ClientAddress address2;
String anotherfield;
..
getters() and setters()
public class ClientAddress {
String type;
String shippingMethod;
String street;
int streetNo;
..
getters() and setters()
}
}
我为获取数据并填充包装器字段而编写的指令是:
Client[] clientsArray= (new Gson()).fromJson(jsonClients, Client[].class);
结果只是部分令人满意;我设法访问了所有原始字段(例如 name、email1..),但 address1 和 address2 字段均为空。结果,
clientsArray[i].getAddress1().getShippingMethod();
返回一个空字符串。
我哪里做错了?
有没有一种特殊的方法来创建我缺少的类?
注意:从结构的角度来看,我的 JSON 对象是完全有效的。如果您看到任何错误,可能是因为我在手动创建上述虚拟/演示时它们滑倒了。
【问题讨论】:
-
我在您的
JSON中注意到:"shippingMethod": null,。你确定你没有得到其中之一吗?并且address1和address2不能为空,否则在尝试调用空引用上的方法时会得到 NPE。 -
@vinitius 好的,所以您是说 JSON 中的“空白”字段应该类似于“shippingMethod”:“”,“not shippingMethod”:null,否则会引发 NPE?同样适用于拥有自己的字段的字段? (在我的情况下是地址 1 和地址 2)?
-
@Razvan 没有。
JSON没问题。我是说:当 shippingMethod 确实为 null 时,您确定没有遇到这种情况吗? 我的意思是,如果 address1 和 adress2 为 null ,您会在这里遇到异常。所以GSON似乎正在按预期解析 json。我没有看到与您的课程和您发布的 json 相关的任何错误 -
@vinitius 我得到的是非原始字段(地址 1 和地址 2)的空值,尽管如果我进入调试角度并检查 JSON 字符串,地址 1 和地址 2 字段就在那里。
-
@Razvan 如果 address1 是
null,则语句:clientsArray[i].getAddress1().getShippingMethod();将抛出NPE。你有例外吗?如果不是,则它不为空,但属性shippingMehtod可能会返回一个null字符串,例如。正如您在发布的 json 中指出的那样,在某些情况下,此属性shippingMehtod是 , INDEED,null。
标签: java android json parsing gson