当前位置: 首页 > 知识库问答 >
问题:

格森。toJson()抛出StackOverflower错误

秦凯旋
2023-03-14

我想从我的对象生成一个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;

知道是什么导致了这个错误吗?我该如何修复它?

共有3个答案

卫逸春
2023-03-14

如果您使用的是Realm并且遇到此错误,并且遇到麻烦的对象扩展了RealmObject,请不要忘记执行realm.copyFromRealm(myObject)以创建一个没有所有Realm绑定的副本,然后再传递给GSON进行序列化。

我错过了为一堆被复制的对象中的一个这样做......我花了很长时间才意识到堆栈跟踪没有命名对象类/类型。问题是,这个问题是由循环引用引起的,但它是RealmObject基类中某个地方的循环引用,而不是您自己的子类,这使得它更难被发现!

公冶安怡
2023-03-14

当我将Log4J记录器作为类属性时,我遇到了这个问题,例如:

private Logger logger = Logger.getLogger(Foo.class);

这可以通过使记录器静态或简单地将其移动到实际功能中来解决。

陈成济
2023-03-14

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

在您引用的BomModule类中:

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

显然,GSON根本不喜欢对BomModule的自我引用。

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

item.setModules(null);

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

private transient Collection<BomModule> parentModules;
private transient Collection<BomModule> subModules;
 类似资料:
  • 我有以下输出: 但问题是玩家阵列来得太早,部分初始细节被遗漏了。 这是我的代码: 你可以在这篇文章中找到游戏、玩家头像和游戏玩家类的详细信息:https://stackoverflow.com/a/33048622 有人知道我怎样才能正确订购这个吗?

  • 我得到而调用 Java语言lang.StackOverflowerr:org处为null。阿帕奇。平民登录中。日志适配器$Slf4jLog。isDebugEnabled(LogAdapter.java:300)~[spring-jcl-5.1.10.RELEASE.jar:5.1.10.RELEASE]位于org。springframework。安全身份验证。ProviderManager。在or

  • 用户错误报告显示偶尔会返回,但对于大多数用户来说,它工作正常。 我访问了一位用户,他在手机上遇到了错误并调试了应用程序,我制作了来显示发送到服务器的内容,我看到Toast显示了,并且记录和ID不是。 这是我所做的。 这里我做序列化对象 但是)对于一些用户来说是正确的,但是对于一些用户来说返回 服务器数据库显示一些用户发送了数据,但一些用户发送了正确的json。经过一些研究,我发现了新的Gson()

  • 当我将Object转换为Json时,我遇到了大十进制精度丢失的问题。 假设我有Pojo类, 现在我将值设置为Pojo,然后转换为JSON 第一次测试-正确输出 第二次测试-输出错误(失去BigDecimal精度) 第三次测试-输出错误(失去BigDecimal精度) 令人惊讶的是,每当BigDecimal值的长度更大时,它也会截断小数点。json转换有什么问题。你能给我提供解决方案吗?

  • 我正在尝试使用方法,但它正在重新生成类的对象哈希代码,例如: 但是,我可以检索用户。没有任何问题和所有关系的专业知识: 这是我的Gson方法: 这是我的MyTypeAdapter: } 那么,如何让实际返回一个Json字符串,以便我可以使用Gson. FromJson在我的另一端?提前谢谢。

  • 我目前有以下课程: 我想用它来创建json。为此,我使用了以下代码: 当我这样做的时候,我得到一个java.lang.StackOverFlowError: 所以,我的问题是:如何让我的 gson 从类 TabInfo 创建 java 对象的有效 json,而不会收到堆栈溢出错误? 顺便说一句。正如你们所看到的,我以前没有问过那么多问题,所以如果你对如何改进我的问题有任何反馈,请告诉我! 编辑1: