gson.toJson()抛出StackOverflowError [英] gson.toJson() throws StackOverflowError

查看:1604
本文介绍了gson.toJson()抛出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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆