使用Gson将JSON反序列化为非静态嵌套类

时间:2013-05-15 21:07:42

标签: java json parsing gson

根据this Gson可以反序列化到内部类。我有JSON字符串的下一个片段:

...
"coordinates": {
    "coordinates": [106.80552006,-6.22016938],
    "type": "Point",
}
...

我正在使用下一堂课:

public class Tweet {
  public Coordinates coordinates = new Coordinates();

  public class Coordinates {
    public double[] coordinates;
  }
}

并尝试解析我的JSON字符串:

Tweet tweet = gson.fromJson(string, Tweet.class);
Tweet.Coordinates tweetCoordinates = gson.fromJson(string, Tweet.Coordinates.class);

但是我收到了这个错误:

Expected BEGIN_ARRAY but was BEGIN_OBJECT

你能告诉我错误在哪里吗?

1 个答案:

答案 0 :(得分:5)

当我将Gson与嵌套类一起使用时,我总是需要让它们static才能工作......在你的链接中,他们说没有必要,但在Gson documentation中明确说:

  

“Gson也可以反序列化静态嵌套类。但是,Gson不能   因为它们没有args,所以自动反序列化纯内部类   构造函数还需要对包含Object的引用   在反序列化时不可用。你可以解决这个问题   通过使内部类静态或通过提供一个问题来解决问题   自定义InstanceCreator。“


无论如何,如果它实际上可以反序列化为非静态内部类,那么你的问题就是......

首先,您使用以下内容Tweet解析JSON:

Tweet tweet = gson.fromJson(string, Tweet.class);

应该有效,因为类Tweet 匹配 JSON响应。但是,您尝试使用类Coordinates解析相同的JSON响应,这显然不会匹配 JSON响应...此外,根本不需要解析同样的回应两次!

如果您的第一次解析确实有效,那么如果您想要访问Coordinates对象,只需执行以下操作:

Tweet.Coordinates tweetCoordinates = tweet.getCordinates();

如果使用类Tweet解析也不起作用,请尝试创建内部类static,如果这也不起作用,请发表评论,我会尝试找到另一个溶液...