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

gson.toJson()抛出StackOverflowError

慕河
2023-03-14
问题内容

我想从我的对象生成一个JSON字符串

Gson gson = new Gson();
String json = gson.toJson(item);

每当我尝试这样做时,都会出现此错误:

14:46:40,236 ERROR [[BomItemToJSON]] Servlet.service() for servlet BomItemToJSON threw exception
java.lang.StackOverflowError
    at com.google.gson.stream.JsonWriter.string(JsonWriter.java:473)
    at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:347)
    at com.google.gson.stream.JsonWriter.value(JsonWriter.java:440)
    at com.google.gson.internal.bind.TypeAdapters$7.write(TypeAdapters.java:235)
    at com.google.gson.internal.bind.TypeAdapters$7.write(TypeAdapters.java:220)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:200)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
    at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:843)

这些是我的 BomItem 类的属性:

private int itemId;
private Collection<BomModule> modules;
private boolean deprecated;
private String partNumber;
private String description; //LOB
private int quantity;
private String unitPriceDollar;
private String unitPriceEuro;
private String discount; 
private String totalDollar;
private String totalEuro;
private String itemClass;
private String itemType;
private String vendor;
private Calendar listPriceDate;
private String unitWeight;
private String unitAveragePower;
private String unitMaxHeatDissipation;
private String unitRackSpace;

我引用的 BomModule 类的属性:

private int moduleId;
private String moduleName;
private boolean isRootModule;
private Collection<BomModule> parentModules;
private Collection<BomModule> subModules;
private Collection<BomItem> items;
private int quantity;

知道导致此错误的原因是什么?我该如何解决?


问题答案:

问题是您有一个循环引用。

BomModule课程中,您引用的是:

private Collection<BomModule> parentModules;
private Collection<BomModule> subModules;

BomModule显然,GSON完全不喜欢这种自我指涉。

解决方法是将模块设置null为避免递归循环。这样我可以避免StackOverFlow-Exception。

item.setModules(null);

或使用关键字标记您 不想 在序列化json中显示的字段transient,例如:

private transient Collection<BomModule> parentModules;
private transient Collection<BomModule> subModules;


 类似资料:
  • 我在java中使用play框架(ebean是我的ORM),我有这个类: 我正在尝试使用Gson库对其进行序列化。我试着这么做 但我总是会犯这样的错误: 我读了很多关于这方面的书,我知道在序列化Reservation对象时,可能会在某个地方发生无限循环,但由于该对象与任何其他类没有任何关系,我不明白为什么会发生这种情况。

  • 我用的是Gson。toJSON方法。我的pojo包含一个属性作为URL字符串。奇怪的是Gson转换器改变了URL字符 输出为:/myApp/myAction。html?方法\U003Drooter\u0026cmd\u003d1 预期输出为:/myApp/myAction。html?方法=路由器

  • 我对Gson将集合更改为Json对象有问题。这是我的代码: 这是输出: JsonString会被创建,但只会使用最新的对象一次又一次地创建。我做错了什么?

  • 但是在部署之后,我无法访问任何控制器,1-5分钟之后,我得到了以下stacktrace: 没有springfox,我的控制器工作得很好。我做错了什么?

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 问题内容: 我正在使用“ mvn install”编译一个开源项目,但最终结果为。我尝试执行,但输出为Java摘要,指示这是无效命令。 我正在使用,为什么会发生这种情况? 谢谢, 问题答案: 设置环境变量: