@Configuration
public class JacksonConfig {
// 定义时间格式
private static final String DATE_FORMAT = "yyyy-MM-dd";
private static final String TIME_FORMAT = "HH:mm:ss";
private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Bean
@Primary
@ConditionalOnMissingBean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
// 1. 配置时间格式
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
objectMapper.registerModule(javaTimeModule);
// 禁用时间戳
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// 2. 配置BigDecimal精度处理
SimpleModule bigDecimalModule = new SimpleModule();
bigDecimalModule.addSerializer(BigDecimal.class, new DecimalSerializer());
bigDecimalModule.addDeserializer(BigDecimal.class, new DecimalDeserializer());
objectMapper.registerModule(bigDecimalModule);
// 3. 其他通用配置
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
return objectMapper;
}
}
解析序列化和反序列化注解,根据解析的内容进行序列化或者反序列化
public class DecimalDeserializer extends JsonDeserializer<BigDecimal> implements ContextualDeserializer {
private int scale = 2;
/**
* 除数因子
*/
private int divide = 0;
/**
* 乘数因子
*/
private int multiply = 0;
public DecimalDeserializer() {
}
public DecimalDeserializer(int scale, int divide, int multiply) {
this.scale = scale;
this.divide = divide;
this.multiply = multiply;
}
/**
* 获取字段上配置的反序列化
*/
@Override
public JsonDeserializer<?> createContextual(DeserializationContext prov, BeanProperty property) {
if (property != null && property.getAnnotation(BigDecimalScaleDeserialize.class) != null) {
BigDecimalScaleDeserialize annotation = property.getAnnotation(BigDecimalScaleDeserialize.class);
return new DecimalDeserializer(annotation.scale(),
Math.abs(annotation.divide()),
Math.abs(annotation.multiply())
);
}
return this;
}
@Override
public BigDecimal deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
String text = jsonParser.getText();
BigDecimal o = BigDecimal.ZERO;
if (StringUtils.isNotBlank(text))
o = new BigDecimal(text);
if (multiply != 0) {
o = o.multiply(new BigDecimal(multiply));
}
if(divide != 0) {
o = o.divide(new BigDecimal(divide));
}
return o.setScale(scale, RoundingMode.HALF_UP);
}
}
反序列化注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BigDecimalScaleDeserialize {
/**
* 精度
* @return
*/
int scale() default 2;
/**
* 除数 仅为正数
*/
int divide() default 0;
/**
* 乘数因子
*/
int multiply() default 0;
}
序列化注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BigDecimalScaleSerialize {
int scale() default 2;
/**
* 除数 仅为正数
*/
int divide() default 0;
/**
* 乘数因子
*/
int multiply() default 0;
}