gson.toJson()抛出StackOverflowError [英] gson.toJson() throws StackOverflowError
问题描述
Gson gson = new Gson();我想从我的对象中生成一个JSON字符串。
String json = gson.toJson(item);
每次尝试这样做时,都会收到此错误:
14:46:40,236 ERROR [[BomItemToJSON]] Servlet.service()for servlet BomItemToJSON抛出异常
java.lang.StackOverflowError
at com.google.gson.stream.JsonWriter.string(JsonWriter.java:473)
位于com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:347)
位于com.google。 gson.stream.JsonWriter.value(JsonWriter.java:440)
在com.google.gson.internal.bind.TypeAdapters $ 7.write(TypeAdapters.java:235)
在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)
在com.google.gson.internal.bind.CollectionTypeAdapterFactory $ Adapter.write(CollectionTypeAdapterFactory.java:60)
在com.google.gson.Gson $ FutureTypeAdapter.write(Gson.java: 843)
这些是 BomItem 类的属性:
private int itemId;
私人收藏< BomModule>模块;
私有布尔值弃用;
private String partNumber;
私有字符串描述; // LOB
private int quantity;
private String unitPriceDollar;
private String unitPriceEuro;
私人字符串折扣;
private String totalDollar;
私人字符串totalEuro;
private String itemClass;
private String itemType;
私有字符串供应商;
私人日历listPriceDate;
private String unitWeight;
私人字符串unitAveragePower;
private String unitMaxHeatDissipation;
private String unitRackSpace;
我引用的 BomModule 类的属性:
private int moduleId;
private String moduleName;
private boolean isRootModule;
私人收藏< BomModule> parentModules;
私人收藏< BomModule>子模块;
私人收藏< BomItem>项目;
private int数量;
任何想法导致此错误的原因是什么?我该如何解决它?
这个问题是你有循环引用。 b $ b
在您引用的 BomModule
类中:
私人收藏< BomModule> parentModules;
私人收藏< BomModule>子模块;
显然,自引用 BomModule
解决方法是将模块设置为 null以避免递归循环。这样我可以避免StackOverFlow异常。
item.setModules(null);
或者将您不要的字段标记为通过使用 transient
关键字,例如: ; BomModule> parentModules;
私有瞬时收集< BomModule>子模块;
I would like to generate a JSON String from my object:
Gson gson = new Gson();
String json = gson.toJson(item);
Everytime I try to do this, I get this error:
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)
These are the attributes of my BomItem class:
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;
Attributes of my referenced BomModule class:
private int moduleId;
private String moduleName;
private boolean isRootModule;
private Collection<BomModule> parentModules;
private Collection<BomModule> subModules;
private Collection<BomItem> items;
private int quantity;
Any idea what causes this error? How can I fix it?
That problem is that you have a circular reference.
In the BomModule
class you are referencing to:
private Collection<BomModule> parentModules;
private Collection<BomModule> subModules;
That self reference to BomModule
, obviously, not liked by GSON at all.
A workaround is just set the modules to null
to avoid the recursive looping. This way I can avoid the StackOverFlow-Exception.
item.setModules(null);
Or mark the fields you don't want to show up in the serialized json by using the transient
keyword, eg:
private transient Collection<BomModule> parentModules;
private transient Collection<BomModule> subModules;
这篇关于gson.toJson()抛出StackOverflowError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!