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
相关产品推荐
相关产品推荐

