标签:Jackson SpringBoot java jackson import 序列化 com public BigDecimal
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);
}
}
完毕
标签:Jackson,SpringBoot,java,jackson,import,序列化,com,public,BigDecimal 来源: https://www.cnblogs.com/zolmk/p/16436338.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。