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

Jackson 2.11.2中ObjectMapper如何将Java null序列化为空字符串?

解决Jackson-databind 2.11.2中NullValueSerializer不触发的问题

核心问题分析

你的代码未生效主要有两个原因:

  1. 未开启null属性序列化开关:默认情况下Jackson会跳过null属性,根本不会触发null值序列化逻辑。
  2. 错误替换SerializerProvider:直接新建DefaultSerializerProvider.Impl会丢失JodaMapper自带的序列化配置(比如Joda时间类型的处理逻辑),导致原有配置被覆盖后无法正常触发自定义序列化器。

可行解决思路及代码示例

方案一:用SimpleModule注册null值序列化器(推荐)

这是Jackson官方推荐的扩展方式,兼容性更好,不会破坏原有配置:

ObjectMapper MAPPER = new JodaMapper();

// 关键:开启null属性序列化,否则null字段会被直接忽略
MAPPER.enable(MapperFeature.SERIALIZE_NULLS);

// 创建自定义模块注册null值序列化器
SimpleModule nullStringModule = new SimpleModule();
nullStringModule.addSerializer(new JsonSerializer<Object>() {
    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        // 将null序列化为空字符串
        gen.writeString("");
    }
}, Object.class);

// 注册模块到ObjectMapper
MAPPER.registerModule(nullStringModule);

方案二:基于原有SerializerProvider修改

如果必须修改SerializerProvider,不要新建实例,而是获取ObjectMapper原有的Provider进行修改:

ObjectMapper MAPPER = new JodaMapper();
MAPPER.enable(MapperFeature.SERIALIZE_NULLS);

// 获取原有的SerializerProvider实例,避免丢失JodaMapper的配置
DefaultSerializerProvider.Impl existingProvider = (DefaultSerializerProvider.Impl) MAPPER.getSerializerProvider();
existingProvider.setNullValueSerializer(new JsonSerializer<Object>() {
    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString("");
    }
});

// 重新设置修改后的Provider
MAPPER.setSerializerProvider(existingProvider);

额外注意事项

  • 如果你使用的是Jackson 2.11.x版本,SerializationFeature.WRITE_NULL_PROPERTIES已被标记为过时,推荐使用MapperFeature.SERIALIZE_NULLS。
  • 如果某些字段有单独的自定义序列化器,需要确保该字段的序列化器不会覆盖全局的null序列化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:36:29