自定义jackson反序列null和空字符串的默认值

2022-07-28,,,,

将json反序列化,但是不希望对象的属性中有null或者空字符串,那么就可以采用以下方案。
首先是实体类

package com.example.demo.dto;

import com.example.demo.config.StringDeserializer;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    @JsonProperty(value = "name")
    @JsonDeserialize(using = StringDeserializer.class)
    private String name = "-";

    @JsonProperty(value = "age")
    private Integer age = 22;

    @JsonProperty(value = "sex")
    private String sex = "-";

}

接下来是反序列化String的例子,其他类型没试过,但是猜测应该差不了多少。

package com.example.demo.config;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import java.io.IOException;
import org.springframework.util.StringUtils;

public class StringDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        String value = jsonParser.getText();
        return StringUtils.isEmpty(value) ?
                "-" : value;
    }

    @Override
    public String getNullValue(DeserializationContext ctxt) throws JsonMappingException {
        return "-";
    }
}

这种方案可以将以下三种情况转换成自定义默认值

  1. json中没有这种属性。
  2. json中有这种属性,但是为null。
  3. json中有这种属性,但是为“”(空字符串)。

第一种情况下,反序列化时,取的是实体类中的默认值;
第二种情况下,反序列化时会走自定义的反序列化类,但是不走deserialize方法,而是调用getNullValue()方法;
第三种情况下,会调用deserialize方法。

在实体类需要使用这种逻辑处理的属性上加上@JsonDeserialize(using = StringDeserializer.class)注解,即可生效。

本文地址:https://blog.csdn.net/baidu_33470149/article/details/109567365

《自定义jackson反序列null和空字符串的默认值.doc》

下载本文的Word格式文档,以方便收藏与打印。