java - JSON 嵌套对象

标签 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 帖子中的两个解串器解决方案, Get nested JSON object with GSON using retrofit但它仍然产生了相同的空错误。

根据这篇 SO 帖子, Java - Gson parsing nested within nested我所拥有的应该很接近。

我在没有嵌套对象的情况下测试了我的代码,即,我从字符串和 Location_JSON 容器中删除了嵌套对象,并且一切正常。所以我相信这是一个 JSON 嵌套对象问题。

更新:

如果您正在查看这篇文章,我只想指出,我接受了 Chengpohi 的回答,因为它解决了我最初的问题,并且 Chengpohi 是第一个提供答案的人。然而,我确实有第二个问题,直到这个问题解决后我才发现。 Sachin Gupta 为我的第二个问题提供了一个可行的解决方案。如果您正在使用这篇文章,请查看下面的两个答案。谢谢。

最佳答案

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
    }

关于java - JSON 嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30722362/

相关文章:

java - JSP在 session 中存储密码

java - 如何向后旋转数组元素

java - 即使除以 100 也会发生 "Non-terminating decimal expansion; no exact representable decimal result"

javascript - JSON 格式的 Jquery.ajax API 请求在 Chrome 中导致 "Uncaught SyntaxError: Unexpected token :"

java - 如何在Java中为gson确定运行时对象的类型

java - Java中如何为继承字段赋值?

json - 结构标签选项不为字段提供标签名称

java - 如何将 String JSON 值取入 HashMap

java - 如何使用 GSON 有效地延迟加载 JSON 文件的特定元素?

java - 更改 gson 中的默认枚举序列化和反序列化