SpringBoot中Jackson的使用:注册全局的序列化和反序列化器

2022/7/2 6:20:12

本文主要是介绍SpringBoot中Jackson的使用:注册全局的序列化和反序列化器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

SpringBoot中Jackson的使用:注册全局的序列化和反序列化器

什么情况下会用到?
当我们需要对在接口中,对接收参数做一些复杂格式校验的时候。例如有个需求,需要对BigDecimal类型的入参做格式校验,并且校验不通过时,返回对应的错误信息。

创建序列化器和反序列化器

BigDecimalSerializer.java

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
    @Override
    public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (bigDecimal == null) {
            jsonGenerator.writeString("0.00");
        }else {
            // 保留两位小数
            bigDecimal = bigDecimal.setScale(2, RoundingMode.UP);
            // 不使用科学计数法
            jsonGenerator.writeString(bigDecimal.toPlainString());
        }
    }
}

BigDecimalDeserializer.java

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fy.chars.StringUtils;
import com.fy.exception.BizException;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.function.Predicate;
import java.util.regex.Pattern;

public class BigDecimalDeserializer extends JsonDeserializer<BigDecimal> {
    public static final String PATTERN = "^[0-9]*\\.?[0-9]{0,2}$";
    public static final Predicate<String> PATTERN_BIG_DECIMAL = Pattern.compile(PATTERN).asPredicate();
    @Override
    public BigDecimal deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        String s = jsonParser.readValueAs(String.class);
        if (StringUtils.isBlank(s))  return null;
        if (PATTERN_BIG_DECIMAL.test(s)) {
            return new BigDecimal(s);
        }
        throw new BizException("BigDecimal格式错误");
    }
}

注册到全局

GlobalJacksonConfiguration.java

import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.math.BigDecimal;
import java.util.List;

@Configuration
public class GlobalJacksonConfiguration extends WebMvcConfigurationSupport {
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        SimpleModule module = new SimpleModule();

        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        
        module.addDeserializer(BigDecimal.class, new BigDecimalDeserializer());
        module.addSerializer(new BigDecimalSerializer());
        
        converter.getObjectMapper().registerModule(module);
        
        converters.add(converter);
        
        super.configureMessageConverters(converters);
    }
}

完毕



这篇关于SpringBoot中Jackson的使用:注册全局的序列化和反序列化器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程