java - 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)

这些是我的 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;

知道是什么导致了这个错误吗?我该如何解决?

最佳答案

那个问题是你有一个循环引用。

在您引用的 BomModule 类中:

private Collection<BomModule> parentModules;
private Collection<BomModule> subModules;

BomModule 的 self 引用,显然 GSON 根本不喜欢。

解决方法是将模块设置为 null 以避免递归循环。这样我可以避免 StackOverFlow-Exception。

item.setModules(null);

或者使用 transient 关键字标记你不想在序列化 json 中显示的字段,例如:

private transient Collection<BomModule> parentModules;
private transient Collection<BomModule> subModules;

https://stackoverflow.com/questions/10209959/

相关文章:

javascript - 将 JSON 对象转换为 pretty-print 的 JSON 的 An

c# - 使用 Web API 返回匿名类型

json - ASP.net MVC 返回 JSONP

java - 如何从 Java HTTPResponse 解析 JSON?

asp.net-mvc - 使用 $.ajax 发布 JSON 数据时如何提供 AntiForger

python - 读取相当大的 JSON 文件

javascript - JSON字符串到JS对象

java - 使用 jackson 的 ObjectMapper 的 JSON 对象的顺序

ruby-on-rails-3 - gem install json -v 1.7.3 给出 'Pl

java - 如何使用 Gson 解析 JSON 数组