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

mid*_*das 3 java parsing json gson

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

...
"coordinates": {
    "coordinates": [106.80552006,-6.22016938],
    "type": "Point",
}
...
Run Code Online (Sandbox Code Playgroud)

我正在使用下一堂课:

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

  public class Coordinates {
    public double[] coordinates;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Tweet tweet = gson.fromJson(string, Tweet.class);
Tweet.Coordinates tweetCoordinates = gson.fromJson(string, Tweet.Coordinates.class);
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

Expected BEGIN_ARRAY but was BEGIN_OBJECT
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ikO 5

当我使用Gson和嵌套类时,我总是需要让它们static工作......在你的链接中他们说这没有必要,但在Gson文档中它清楚地说:

"Gson也可以反序列化静态嵌套类.但是,Gson不能自动反序列化纯内部类,因为它们的no-args构造函数也需要对反序列化时不可用的包含Object的引用.你可以通过以下方法来解决这个问题.要么使内部类静态,要么为它提供自定义InstanceCreator."


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

首先,您将使用以下类来解析JSON Tweet:

Tweet tweet = gson.fromJson(string, Tweet.class);
Run Code Online (Sandbox Code Playgroud)

应该工作,因为类Tweet 匹配 JSON响应.但是,那么你试图用类解析相同的JSON响应Coordinates,这显然 JSON响应不匹配 ...而且根本不需要解析相同的响应两次!

如果您的第一次解析实际上正在工作,那么如果您想要访问该Coordinates对象,只需执行以下操作:

Tweet.Coordinates tweetCoordinates = tweet.getCordinates();
Run Code Online (Sandbox Code Playgroud)

如果对类的解析Tweet也不起作用,请尝试创建内部类static,如果这也不起作用,请发表评论,我会尝试找到另一种解决方案......