Jackson反序列化:如何将JSON中的null转为字符串"null"?
解决方案
首先要明确:@JsonProperty的defaultValue参数不作用于反序列化过程,它仅用于生成JSON Schema时标注默认值说明,所以你遇到的情况是正常的——Jackson反序列化时遇到JSON中的null,会直接将字段设为null,覆盖你初始化的字符串"null"。
下面提供几种可行的解决方式:
方法一:针对单个字段配置null处理逻辑
给需要处理的字段添加@JsonSetter注解,指定当JSON字段为null时使用字段的初始值:
@Data class Person { @JsonProperty(value = "name") @JsonSetter(nulls = Nulls.SET) private String name = "null"; @JsonProperty(value = "surName") @JsonSetter(nulls = Nulls.SET) private String surName = "null"; }
@JsonSetter(nulls = Nulls.SET)的作用是:当JSON中对应字段为null时,不将字段设为null,而是保留字段的初始值(也就是你定义的"null"字符串)。
方法二:全局配置所有String字段的null处理
如果你的项目中有大量String字段需要将JSON中的null转为字符串"null",可以自定义反序列化器并全局注册:
1. 自定义字符串反序列化器
class StringNullDeserializer extends StdDeserializer<String> { protected StringNullDeserializer() { super(String.class); } @Override public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { JsonNode node = p.getCodec().readTree(p); // 遇到null节点时返回字符串"null",否则返回原文本 return node.isNull() ? "null" : node.asText(); } }
2. 注册到ObjectMapper
ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addDeserializer(String.class, new StringNullDeserializer()); mapper.registerModule(module); // 执行反序列化 Person person = mapper.readValue(json, Person.class);
这样所有String类型的字段,在反序列化时遇到JSON中的null,都会被自动转为字符串"null"。
方法三:全局配置保留字段初始值
通过ObjectMapper的全局配置,让Jackson在遇到JSON中的null时,不覆盖字段的初始值:
ObjectMapper mapper = new ObjectMapper(); // 配置所有字段遇到null时使用初始值 mapper.setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET)); // 执行反序列化 Person person = mapper.readValue(json, Person.class);
这个配置会作用于所有字段,只要字段有初始值,反序列化时遇到JSON中的null就会保留初始值,适合你这种字段初始值统一为"null"的场景。
内容的提问来源于stack exchange,提问作者Dred
相关产品推荐
相关产品推荐

