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

Jackson序列化:按序列化调用动态修改默认包含规则

如何动态为Jackson ObjectMapper的单次序列化设置Include.NON_NULL规则

完全可以通过ObjectMapper.writer()的链式调用实现动态切换序列化包含规则,同时还能利用Jackson内部的缓存机制保证效率,具体方案如下:

核心实现方式

直接基于原有ObjectMapper生成带有NON_NULL规则的ObjectWriter实例,Jackson会自动缓存这些配置组合的Writer,无需额外维护缓存:

// 你的原有ObjectMapper(全局保留null值配置)
ObjectMapper mapper = new ObjectMapper();

// 生成仅本次序列化生效的NON_NULL规则Writer
ObjectWriter nonNullWriter = mapper.writer().with(JsonInclude.Include.NON_NULL);
// 序列化时排除null值
String jsonWithoutNulls = nonNullWriter.writeValueAsString(yourTargetObject);

// 要保留null值时,直接使用原mapper或默认Writer即可
String jsonWithNulls = mapper.writeValueAsString(yourTargetObject);

关键细节说明

  • 线程安全与缓存效率:ObjectWriter是不可变对象,线程安全。每次调用with()生成新Writer时,Jackson内部会缓存该配置组合的实例,重复获取相同规则的Writer不会产生额外性能开销,完全复用mapper的缓存机制。
  • 无侵入性:既不需要修改原mapper的全局默认配置,也不需要给实体类加@JsonInclude注解,更不用额外创建第二个mapper实例,完全在单次序列化调用时动态决定规则。
  • 扩展灵活:如果需要组合其他序列化配置,可链式调用with()方法,比如同时启用格式化输出:
    ObjectWriter formattedNonNullWriter = mapper.writer()
        .with(JsonInclude.Include.NON_NULL)
        .with(SerializationFeature.INDENT_OUTPUT);
    

优化建议

如果需要频繁在两种规则间切换,可提前将两个ObjectWriter实例缓存为类的静态变量,避免每次调用时的链式调用开销(虽然Jackson缓存已经很高效,但提前缓存进一步降低成本):

private static final ObjectMapper MAPPER = new ObjectMapper();
private static final ObjectWriter NON_NULL_WRITER = MAPPER.writer().with(JsonInclude.Include.NON_NULL);

// 使用时直接调用
String json = NON_NULL_WRITER.writeValueAsString(yourObject);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:12:42