Gson.fromJson() 抛出 StackOverflowError

Gson.fromJson() throws StackOverflowError

我们有这个 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]
}

Bean Bank 和 Categoria:

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.WhosebugError' exception.

怎么了?

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

  1. 你的 bean 没有像你说的那样定义。检查它们是否在 getter 和 setter 方法部分中隐藏了其他字段。 This can happen if you have a circular reference.
    • 您在评论中表示这可能是您的问题。我建议:
      1. 从您的 bean 中删除额外的字段
      2. 创建一个包含额外字段的新 class,以及 Asking 实例的一个字段
      3. 使用 Gson 反序列化 Asking 实例,然后将其传递给新的 class 的构造函数。
  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 class 额外字段的定义,要么,如果失败,尝试使你的反序列化匹配我的。