我想从我的对象生成一个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;
你知道是什么导致了这个错误吗?我怎么才能修复它?
发布于 2012-04-18 21:05:06
这个问题是你有一个循环引用。
在您引用的BomModule
类中:
private Collection<BomModule> parentModules;
private Collection<BomModule> subModules;
显然,GSON根本不喜欢BomModule
的自我引用。
一种解决方法是将模块设置为null
,以避免递归循环。这样我就可以避免StackOverFlow异常。
item.setModules(null);
或者使用关键字标记您不希望在序列化的json中显示的字段,例如:
private transient Collection<BomModule> parentModules;
private transient Collection<BomModule> subModules;
发布于 2013-01-29 06:02:17
当我将Log4J记录器作为类属性时,我遇到了这个问题,例如:
private Logger logger = Logger.getLogger(Foo.class);
这可以通过将记录器设置为static
或简单地将其移到实际函数中来解决。
发布于 2016-09-24 06:36:20
如果您在使用Realm时遇到这个错误,并且出现问题的对象扩展了RealmObject,那么在传递给GSON进行序列化之前,不要忘记使用realm.copyFromRealm(myObject)
来创建一个没有所有Realm绑定的副本。
我只是因为一堆被复制的对象中的一个而错过了这个。我花了很长时间才意识到堆栈跟踪没有命名对象类/类型。问题是,这个问题是由循环引用引起的,但它是RealmObject基类中的某个循环引用,而不是您自己的子类,这使得它更难识别!
https://stackoverflow.com/questions/10209959
复制相似问题