欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-10 18:19:51
将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;i...

将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

相关标签: 笔记 java