我正在使用具有嵌套对象的JSON文件,
{
"LocId":99,
"typeId":99,
"name":"foo",
"parentId":99,
"geoCode":
{
"type":"bang",
"coordinates":
[{
"latitude":99.0,
"longitude":99.0
}]
}
}
我创建了一个容器,用于将JSON文件保存在这样的类中,
public class Location_JSON {
private LocId id;
// +getter+setter
@Override
public String toString() {
return id.toString();
}
public static class LocId {
private Long locId;
private Long typeId;
private String name;
private Long parentId;
private GeoCode geoCode;
// +getters+setters
@Override
public String toString() {
return "{\"locId\":" + locId
+ ", \"typeId\":" + typeId
+ ", \"name\":" + name
+ ", \"geoCode\":" + geoCode.toString() + "}";
}
}
public static class GeoCode {
private String type;
private Coordinates coordinates;
// +getter+setter
@Override
public String toString() {
//return "{\"type\":" + type + "}";
return "{\"type\":" + type
+ ", \"coordinates\":" + coordinates.toString() + "}";
}
}
public static class Coordinates {
private Double latitude;
private Double longitude;
// +getter+setter
@Override
public String toString() {
return "[{\"latitude\":" + latitude
+ ", \"longitude\":" + longitude + "}]";
}
}
}
为了测试一切正常,我在JSON对象中读取这样的字符串,
String str = "the JSON string shown above";
InputStream is = new ByteArrayInputStream(str.getBytes());
BufferedReader br = new BufferedReader(new InputStreamReader(is));
Location_JSON locations = new Gson().fromJson(br, Location_JSON.class);
System.out.println(locations.toString());
这会产生NullPointerException!
我实现了这篇SO帖子中的两个Deserializer解决方案, Get nested JSON object with GSON using retrofit但它仍然创建了相同的空错误。
根据这篇SO帖子, 我应该接近Java - Gson parsing nested within nested。
我在没有嵌套对象的情况下测试了我的代码,即我从字符串和Location_JSON容器中删除了嵌套对象,一切正常。所以我认为这是一个JSON嵌套对象问题。
更新
如果你正在看这篇文章,我只想指出我接受了 chengpohi 的答案,因为它解决了我的初步问题,而chengpohi是第一个提供回答。然而,我确实遇到了第二个问题,直到这个问题解决后才发现。 Sachin Gupta 为我的第二个问题提供了一个有效的解决方案。如果您使用此帖子,请在下面查看两个答案。谢谢。
答案 0 :(得分:1)
Location_JSON locations = new Gson().fromJson(br, Location_JSON.class);
它应该是:
LocId locations = new Gson().fromJson(br, LocId.class);
您获得NullPointerException
,因为您的LocId
尚未初始化。您的JSON是LocId
的对象。
和你的JSON:
"coordinates":
[{
"latitude":99.0,
"longitude":99.0
}]
应该是:
"coordinates":
{
"latitude":99.0,
"longitude":99.0
}
答案 1 :(得分:1)
正如上面的答案中所述,您必须使用LocId
类作为主要类。
现在对于java.lang.IllegalStateException
,您可以修改GeoCode
类以使用Coordinates
类的数组。喜欢:
public static class GeoCode {
private String type;
private Coordinates []coordinates;
// +getter+setter
@Override
public String toString() {
return "GeoCode [type=" + type + ", coordinates=" + Arrays.toString(coordinates) + "]";
}
}