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

