gson.toJson()抛出StackOverflowError

我想从我的对象生成一个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)

这些是我的 类的属性:

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;

我引用的 类的属性:

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;

以上是 gson.toJson()抛出StackOverflowError 的全部内容, 来源链接: utcz.com/qa/425141.html

回到顶部