当前位置: 首页 > 面试题库 >

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

宁鹏程
2023-03-14
问题内容

根据该 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

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


问题答案:

当我将Gson与嵌套类一起使用时,我总是需要使它们static起作用。在您的链接中,他们说这是没有必要的,但是在
Gson文档中
明确指出:

“ Gson还可以反序列化静态嵌套类。但是,Gson不能自动反序列化纯内部类,因为它们的no-
args构造函数还需要引用在反序列化时不可用的包含对象。您可以通过以下方法解决此问题:或者将内部类设为静态,或者为其提供自定义InstanceCreator。”

无论如何,如果实际上有可能反序列化为非静态内部类,则您的问题将是…

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

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

由于类别Tweet JSON回应 相符
,因此应该可以正常运作。但是,然后您尝试使用class解析相同的JSON响应Coordinates,这显然 JSON响应不 匹配
…而且,将相同的响应解析两次根本没有任何意义!

如果您的第一次解析实际上是有效的,那么如果您想访问该Coordinates对象,请执行以下操作:

Tweet.Coordinates tweetCoordinates = tweet.getCordinates();

如果使用该类进行的解析Tweet也不起作用,请尝试制作内部类static,如果该方法也不起作用,请发表评论,我将尝试寻找另一种解决方案…



 类似资料:
  • 问题内容: 所有,我都有以下输出/字符串(它是JIRA API的响应): 我用于遍历元素并获取值。我在下面的“嵌套对象”示例中编写了类 http://www.javacreed.com/gson-deserialiser- example/ 我能够获得到第二级的元素值。例如:在此级别之前,我能够获得的值以及其他值。我如何获得的价值? 我应该如何构造我的解串器和类。请协助。谢谢。 问题答案: 试试这

  • 问题内容: 在我当前的项目中,我在android中使用GSON库,并且遇到了嵌套地图反序列化的问题。这就是初始json的样子 而我的pojo的 和花类 但是当我尝试反序列化此对象时,我可以访问嵌套的哈希图,示例代码为 有什么建议? 问题答案: 这告诉Gson您想反序列化为未知值类型的Map。您可能会想指定类似的东西,但是您无法在Java中进行指定,因此解决方案是使用他们在Gson中称为TypeTo

  • 问题内容: 我有一个名为的类,该类具有一个作为参数的构造函数: 具有以下属性: 并且是我的应用程序的其他类,并具有以下构造函数: ,并且是的子类。 我想用Gson 反序列化数组,所以我写道: 以定义为: 调试时,实例具有正确的“ MainActivity”作为上下文,而其成员变量的上下文为null。 Gson 使用正确的构造函数创建了对象,但使用默认的无参数构造函数创建了实例。我怎样才能解决这个问

  • 我有一个名为PageItem的类,它有一个构造函数,该构造函数将上下文作为参数: 具有以下属性: 新闻提供者(Newsprovider)和主题(Topic)是我的应用程序的其他类,具有以下构造函数:

  • 我知道我可以创建一个单独的Report类,然后使用@JSONProperty将其嵌入到ReportResponse中。有没有一种方法可以避免这种情况,并用一个注释标记ReportResponse类,将它映射到JSON中的“Report”元素?

  • 问题内容: 我从看起来像这样的API获取JSON: 我尝试了几种方法来在c#对象中表示此JSON(太多内容无法在此处列出)。我已经尝试过使用列表和字典,这是我尝试表示它的最新示例: 这是我用来反序列化JSON的方法: 包含和。并且包含,但是是。因此,除了反序列化之外,什么都没有。 它应该很简单,但是由于某种原因我无法弄清楚正确的对象表示形式 问题答案: 要使用,即: 假设项目名称和随响应而变化,并