如何配置Jackson控制Null字段行为?实现空字符串映射需求
解决Jackson String类型隐式/显式Null值转空字符串问题
一、自定义序列化器与反序列化器
针对String类型单独处理,不管是序列化还是反序列化,都把Null(显式或隐式)转为空字符串""。
1. 自定义String反序列化器
处理JSON中显式的null值,配合后续配置处理隐式Null(JSON未传入的字段):
public class EmptyStringDeserializer extends StdDeserializer<String> { public EmptyStringDeserializer() { super(String.class); } @Override public String deserialize(JsonParser parser, DeserializationContext context) throws IOException { String value = parser.getValueAsString(); return value == null ? "" : value; } }
2. 自定义String序列化器
把POJO中null的String字段序列化为"":
public class EmptyStringSerializer extends StdSerializer<String> { public EmptyStringSerializer() { super(String.class); } @Override public void serialize(String value, JsonGenerator generator, SerializerProvider provider) throws IOException { generator.writeString(value == null ? "" : value); } }
二、全局配置(推荐)
将自定义序列化器/反序列化器注册到ObjectMapper,全局生效无需修改每个POJO:
ObjectMapper objectMapper = new ObjectMapper(); // 注册String类型的序列化器和反序列化器 SimpleModule module = new SimpleModule(); module.addSerializer(String.class, new EmptyStringSerializer()); module.addDeserializer(String.class, new EmptyStringDeserializer()); objectMapper.registerModule(module); // 序列化配置:确保所有字段都被序列化(包括原本为null的字段) objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); // 反序列化配置:允许JSON中缺少POJO字段,避免报错 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
三、局部配置(单POJO或字段)
如果不想全局生效,可在POJO字段上直接添加注解:
public class RequestBody { @JsonSerialize(using = EmptyStringSerializer.class) @JsonDeserialize(using = EmptyStringDeserializer.class) String firstName = ""; // 初始化空字符串处理隐式Null @JsonSerialize(using = EmptyStringSerializer.class) @JsonDeserialize(using = EmptyStringDeserializer.class) String middleName = ""; @JsonSerialize(using = EmptyStringSerializer.class) @JsonDeserialize(using = EmptyStringDeserializer.class) String lastName = ""; // 构造器、getter/setter省略 }
四、关键说明
- 隐式Null处理:JSON中未传入的字段,POJO字段默认是
null,通过**字段初始化赋值""**即可转为空字符串; - 显式Null处理:自定义序列化器/反序列化器会直接把JSON中的
null或POJO中的null转为""; JsonInclude.Include.ALWAYS的作用是让序列化时不忽略null字段,确保自定义序列化器能将null转为""输出。
内容的提问来源于stack exchange,提问作者Ruturaj Dilip Mestry
相关产品推荐
相关产品推荐

