gson.tojson()返回空字符串、null或{},主因是private字段未加@expose且未配置excludefieldswithoutexposeannotation、字段被transient修饰、传入null对象未启用serializenulls();日期需自定义格式或typeadapter;泛型list转json无问题,但反序列化须用typetoken补全类型信息。

toJson 方法为什么返回空字符串或 null
常见现象是调用 Gson.toJson() 后得到空字符串、null,或者只输出 {}。根本原因通常是对象字段全是 private 且没配 GsonBuilder().excludeFieldsWithoutExposeAnnotation(),又没加 @Expose;或者字段被 transient 修饰,Gson 默认跳过它。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 确认目标字段是
public,或启用字段访问:用new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).create() - 若必须保留
private字段,加@Expose并显式启用:new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create() - 检查是否误用了
transient—— Gson 默认不序列化它,除非调用.serializeNulls()并配合自定义TypeAdapter - 避免传入
null对象:传null给toJson()默认输出"null"字符串(不是字面量null),如需输出null值需开启.serializeNulls()
如何让 toJson 输出 null 字段而不是跳过
默认情况下,Gson 会忽略值为 null 的字段,导致 JSON 缺失该 key。这不是 bug,是默认行为。要强制保留 null,必须显式配置。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 创建 Gson 实例时加
.serializeNulls():new GsonBuilder().serializeNulls().create() - 注意:这会影响所有字段,包括嵌套对象中的
null值,可能增大 JSON 体积 - 不推荐在全局 Gson 实例中长期开启,尤其在高并发 API 返回场景下;应按需构造专用实例
- 若只想对某类字段生效(比如仅 String 类型),得写自定义
TypeAdapter,不能靠serializeNulls()
toJson 处理日期类型时的格式错乱问题
直接传 java.util.Date 或 LocalDateTime 给 toJson(),常出现时间戳数字、时区偏移混乱、甚至抛 IllegalArgumentException。因为 Gson 默认只认 Date,且序列化成毫秒数,不带格式控制。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 对
Date:用new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create() - 对
LocalDateTime/ZonedDateTime:必须注册TypeAdapter,例如用JavaTimeAdapter(需 gson 2.9+)或手动实现 - 避免依赖系统默认时区:显式指定时区,比如
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("UTC")) - 别把
SimpleDateFormat实例复用在多线程环境——它是非线程安全的,Gson 内部不会帮你同步
泛型 List 转 JSON 时类型擦除导致的反序列化失败
toJson() 本身对泛型 List 没问题,但如果你后续要用 fromJson() 还原,就会发现元素变成 LinkedTreeMap 而不是你期望的 User 类型。这是因为 Java 泛型擦除,toJson(list) 不包含类型信息。
实操建议:
立即学习“Java免费学习笔记(深入)”;
-
toJson()输出正确不代表能原样还原;重点在反序列化端补全类型信息 - 传
TypeToken给fromJson():gson.fromJson(json, new TypeToken<list>>(){}.getType())</list> - 不要写
gson.fromJson(json, List.class)—— 这会导致运行时类型丢失 - 如果只是单次转 JSON 且不涉及反序列化,泛型擦除不影响
toJson()结果,无需额外处理
最易被忽略的是:很多人以为 toJson() 的行为和 fromJson() 对称,其实它只管“出”,不管“回”。类型安全全靠你在下游补全,Gson 不会主动推断泛型。










