Jackson 2.11.2中ObjectMapper如何将Java null序列化为空字符串?
解决Jackson-databind 2.11.2中NullValueSerializer不触发的问题
核心问题分析
你的代码未生效主要有两个原因:
- 未开启null属性序列化开关:默认情况下Jackson会跳过null属性,根本不会触发null值序列化逻辑。
- 错误替换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
相关产品推荐
相关产品推荐

