Jackson和Gson均支持集合与JSON转换,但Jackson在字段映射灵活性、泛型处理、嵌套结构还原及配置精细度上更优;Gson则默认更宽容、易用,但扩展性与复杂场景适应性较弱。

处理集合与 JSON 的转换,关键不在“能不能转”,而在于字段映射是否准确、泛型信息能否保留、嵌套结构是否被正确还原。Jackson 和 Gson 都能完成基础集合序列化,但面对复杂变量(如含大小写混用字段、别名、嵌套泛型、忽略策略不一致的类),它们的行为差异明显。
字段命名不一致时的映射逻辑不同
当 JSON 键是 user_name,而 Java 字段是 userName:
- Jackson 默认启用
PropertyNamingStrategies.SNAKE_CASE(需显式配置),也可用@JsonProperty("user_name")精确绑定;支持@JsonAlias声明多个输入别名,仅用于反序列化 - Gson 默认严格按字段名匹配,必须用
@SerializedName("user_name")显式声明,不支持运行时多别名,也无内置下划线转驼峰策略
泛型集合的反序列化必须绕过类型擦除
Java 运行时无法直接获取 List<User> 中的 User 类型,所以不能只传 List.class。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- Jackson 推荐两种方式:
– 使用new TypeReference<List<User>>() {}(匿名子类保留泛型信息)
– 或构建JavaType:mapper.getTypeFactory().constructParametricType(List.class, User.class) - Gson 同样依赖
TypeToken:new TypeToken<List<User>>() {}.getType(),原理类似,靠匿名子类捕获泛型签名
嵌套对象与多余字段的风险点
若 Java 类中存在大小写不规范的字段(比如 public Integer B;),Jackson 可能通过 getter/setter 推断出额外字段 b,导致序列化结果出现重复键(如 {"B":null,"b":null})。
- 根本原因是 Jackson 默认扫描所有 public 字段 + get/set 方法,按命名惯例推导属性名
- 解决方法:统一使用 private 字段 + 标准 getter/setter,或禁用字段自动发现:
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.NONE) - Gson 不扫描字段,只依赖注解和构造器,因此这类问题较少发生
忽略未知字段与空值策略的实际影响
接口接收 JSON 时,常遇到服务端新增字段、客户端旧版本未识别的情况。
- Jackson 默认抛异常(
FAIL_ON_UNKNOWN_PROPERTIES = true),需手动关闭:mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - Gson 默认静默忽略未知字段,更宽容;但对 null 值,默认序列化为
null,而 Jackson 默认跳过 null 字段(可配Include.NON_NULL) - 两者都支持
@JsonIgnore/@Expose控制单字段行为,但 Jackson 的注解体系更细粒度(如@JsonIgnoreProperties批量忽略)

















