【问题标题】:Gson.fromJson() throws StackOverflowErrorGson.fromJson() 抛出 StackOverflowError
【发布时间】:2015-10-28 13:11:47
【问题描述】:

我们有这个 Json:

{
    "id": 500,
    "field1": "TESTE",
    "banco": {
        "id": 300,
        "descricao": "BANCO_TESTE"
    },
    "categorias": [
        {
            "id": 300,
            "descricao": "PT",
            "publica": true
        }
    ]
}

还有我的豆子:

public class Asking implements Serializable {
     private long id;
     private String field1;
     private Bank bank;
     private List<Categoria> categorias;

     //[getters and setters]
}

豆子银行和类别:

public class Bank implements Serializable {
private Long code;
private Long id;
private String descricao;
//getters and setters
}

public class Categoria implements Serializable {
private Long code;
private Long id;
private String descricao;
private boolean marcada;
private boolean publica;
//getters and setters
}

当我打电话时:

gson.fromJson(strJson, tokenType);

出现错误:

Method threw 'java.lang.StackOverflowError' exception.

怎么了?

【问题讨论】:

  • tokenType 设置为什么?请edit您的代码提供此信息。

标签: java android json gson stack-overflow


【解决方案1】:

我无法重现此问题。这里有两件事之一是错误的:

  1. 您的 bean 没有像您说的那样定义。检查他们是否在 getter 和 setter 方法部分中隐藏了其他字段。 This can happen if you have a circular reference.
    • 您已在 cmets 中声明这很可能是您的问题。我建议:
      1. 从 bean 中删除多余的字段
      2. 创建一个包含额外字段的新类,以及 Asking 实例的字段
      3. 使用 Gson 反序列化 Asking 实例,然后将其传递给新类的构造函数。
  2. 您对gson.fromJson 方法的设置做了一些意想不到的事情。这是我正在使用的,效果很好:

    public static void parseJSON(String jsonString) {
      Gson gsonParser = new Gson();
      Type collectionType = new TypeToken<Asking>(){}.getType();
      Asking gsonResponse = gsonParser.fromJson(jsonString, collectionType);
      System.out.println(gsonResponse);
    }
    

要么检查你的 bean 类定义中是否有额外的字段,要么如果失败,尝试让你的反序列化与我的匹配。

【讨论】:

  • beans有strJson没有的其他字段,会出问题吗?
  • @DimmyMagalhães 如果其他字段是循环引用,则可以。请参阅 #1 中的链接。
  • 没有循环引用。
猜你喜欢
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2013-01-12
  • 2018-07-10
  • 2023-03-10
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多