Spring Boot中Jackson反序列化时如何为null的Long属性设置默认值0
Jackson反序列化null值转默认值0的实现方案
以下几种实现方式都不需要手动遍历对象赋值,性能和原生反序列化几乎一致:
方案1:单个字段配置(最常用,灵活度最高)
Jackson 2.9及以上版本推荐使用,仅对carValue字段生效,不影响其他字段逻辑:
- 给
carValue设置初始默认值0L - 添加
@JsonSetter注解,指定JSON值为null时不覆盖初始值
修改后的Car类字段代码:
@JsonProperty(value = "car_value") @JsonSetter(nulls = Nulls.SKIP) private Long carValue = 0L;
如果项目中使用了Lombok的@Builder注解,需要额外添加@Builder.Default保证Builder模式也能识别默认值:
@Builder.Default @JsonProperty(value = "car_value") @JsonSetter(nulls = Nulls.SKIP) private Long carValue = 0L;
方案2:全局类型配置(适合批量处理同类型字段)
如果所有Long类型的字段反序列化时遇到null都需要转为0,可以直接配置ObjectMapper全局规则,不需要修改实体类:
修改后的反序列化代码:
public List<Car> stringToCar(String json) throws JsonProcessingException { ObjectMapper om = new ObjectMapper(); // 全局配置Long类型null值转为空(数值类型空值对应0) om.configOverride(Long.class) .setSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY)); return om.readValue(json, new TypeReference<List<Car>>() {} ); }
方案3:自定义反序列化器(兼容低版本Jackson)
如果使用的Jackson版本低于2.9,不支持@JsonSetter的nulls参数,可以自定义反序列化器实现:
- 编写Long类型默认值反序列化器
public class LongDefault0Deserializer extends StdDeserializer<Long> { public LongDefault0Deserializer() { super(Long.class); } @Override public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String value = p.getText(); if (value == null || value.isBlank()) { return 0L; } try { return Long.parseLong(value.trim()); } catch (NumberFormatException e) { return 0L; } } @Override public Long getNullValue(DeserializationContext ctxt) { return 0L; } }
- 在实体类字段上绑定反序列化器
@JsonProperty(value = "car_value") @JsonDeserialize(using = LongDefault0Deserializer.class) private Long carValue;
内容的提问来源于stack exchange,提问作者perplexedDev
相关产品推荐
相关产品推荐

