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 exceptionjava.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