JSON嵌套对象

时间:2015-06-09 03:07:28

标签: java json gson

我正在使用具有嵌套对象的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 为我的第二个问题提供了一个有效的解决方案。如果您使用此帖子,请在下面查看两个答案。谢谢。

2 个答案:

答案 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) + "]";
 }
}