You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gson序列化无报错但生成JSON不完整,原因何在?

Gson序列化复杂对象时JSON输出不完整且无报错的原因分析

问题描述

尝试序列化一个结构复杂的对象,使用以下代码:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
PrintWriter output = new PrintWriter(new FileOutputStream("Hotels.json"));
output.write(gson.toJson(myObject););

程序无报错正常终止,但生成的JSON文件在约8000行处截断,末尾内容如下:

],
        "rate": 1.5,
        "ratings": {
          "cleaning": 1.5,
          "position": 4.0,
          "services": 1.5,
          "quality": 2.0
        },
        "rankScore": 1.5,
        "reviewsNum": 2,
        "reviews"

已确认对象无循环引用,疑惑为何无异常抛出。

可能的原因及解决建议

1. 输出流未关闭/刷新

PrintWriter是带缓冲的字符流,若未调用close()或flush(),缓冲区中的剩余内容不会写入文件,程序终止时缓冲数据丢失,导致JSON截断。这是最常见的原因。
解决:使用try-with-resources语法自动管理流(会自动关闭并刷新),同时修正代码中的语法错误(多了一个分号):

try (PrintWriter output = new PrintWriter(new FileOutputStream("Hotels.json"))) {
    output.write(gson.toJson(myObject));
}

2. 磁盘空间不足

写入文件时磁盘剩余空间不足,操作系统会强制截断文件,而PrintWriter默认会吞掉IO异常(需调用checkError()才能发现),导致程序无报错但输出不完整。
解决:检查目标磁盘的剩余空间,确保有足够容量存储完整的JSON文件。

3. JVM内存不足

复杂对象的数据量过大,序列化过程中JVM堆内存耗尽,极端情况下Gson可能静默终止序列化(未抛出OOM异常),导致输出截断。
解决:启动程序时增加JVM堆内存,例如添加-Xmx2G参数(根据实际情况调整大小),同时可以尝试分批序列化大对象,减少内存压力。

4. 对象内部存在隐藏异常

对象中的自定义类可能存在异常逻辑,比如某个属性的getter方法在调用时抛出异常,但Gson内部捕获了该异常并未向外抛出,导致序列化中途停止。
解决:检查对象中所有自定义类的getter方法、序列化相关逻辑,确保没有隐藏的异常;可以尝试序列化对象的子集,逐步排查哪个属性导致问题。

内容的提问来源于stack exchange,提问作者Ernaldo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:12:47