package com.mrcode.case.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.io.IOException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* @author mrcode@126.com
* @date 2022/4/2 16:24
*/
@Configuration
@ConditionalOnClass(ObjectMapper.class)
@AutoConfigureBefore(JacksonAutoConfiguration.class)
@Slf4j
public class JacksonConfig {
final String FORMATTER_DATE_TIME_T = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
final String FORMATTER_DATE_TIME_H = "yyyy-MM-dd HH:mm:ss";
final String FORMATTER_DATE_TIME_S = "yyyy/MM/dd HH:mm:ss";
final String FORMATTER_DATE_H = "yyyy-MM-dd";
final String FORMATTER_DATE_S = "yyyy/MM/dd";
final String FORMATTER_TIME = "HH:mm:ss";
final String T = "T";
final String H = "-";
final String S = "/";
final String P = ".";
final String ZERO_INT64 = "0";
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public Jackson2ObjectMapperBuilderCustomizer customJacksonBuilder() {
return builder -> {
/**
* 配置Date的格式
*/
builder.locale(Locale.CHINA);
builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));
builder.simpleDateFormat(FORMATTER_DATE_TIME_H);
builder.deserializerByType(Date.class, new DateDeserializer());
/**
* 配置java8时间格式
*/
builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(FORMATTER_DATE_TIME_H)));
builder.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(FORMATTER_DATE_H)));
builder.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(FORMATTER_TIME)));
builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer());
builder.deserializerByType(LocalDate.class, new LocalDateDeserializer());
builder.deserializerByType(LocalTime.class, new LocalTimeDeserializer());
/**
* 配置高精度数字字符串格式
*/
builder.serializerByType(Long.TYPE, ToStringSerializer.instance);
builder.serializerByType(Long.class, ToStringSerializer.instance);
builder.serializerByType(BigInteger.class, ToStringSerializer.instance);
builder.serializerByType(BigDecimal.class, ToStringSerializer.instance);
};
}
@Bean
@Primary
public ObjectMapper customObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
String fieldName = jsonGenerator.getOutputContext().getCurrentName();
try {
Field field = jsonGenerator.getCurrentValue().getClass().getDeclaredField(fieldName);
if (Long.class.isAssignableFrom(field.getType())) {
jsonGenerator.writeString(ZERO_INT64);
} else if (BigInteger.class.isAssignableFrom(field.getType())) {
jsonGenerator.writeString(ZERO_INT64);
} else if (BigDecimal.class.isAssignableFrom(field.getType())) {
jsonGenerator.writeString(ZERO_INT64);
} else if (CharSequence.class.isAssignableFrom(field.getType())) {
jsonGenerator.writeString(ZERO_INT64);
} else if (Collection.class.isAssignableFrom(field.getType())) {
jsonGenerator.writeStartArray();
jsonGenerator.writeEndArray();
} else if (Map.class.isAssignableFrom(field.getType())) {
jsonGenerator.writeStartObject();
jsonGenerator.writeEndObject();
}
} catch (NoSuchFieldException ignored) {
log.error("", ignored);
}
}
});
/**
* 不序列化Null值字段
*/
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
/**
* 忽略序列化空对象错误
*/
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
/**
* 忽略反序列化未知属性
*/
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
return objectMapper;
}
public class DateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException {
String value = p.getValueAsString();
SimpleDateFormat formatter = new SimpleDateFormat();
if (value.contains(H)) {
formatter = new SimpleDateFormat(FORMATTER_DATE_TIME_H);
} else if (value.contains(S)) {
formatter = new SimpleDateFormat(FORMATTER_DATE_TIME_S);
}
try {
return formatter.parse(value);
} catch (ParseException e) {
return deserializationContext.parseDate(value);
}
}
}
public class LocalTimeDeserializer extends JsonDeserializer<LocalTime> {
@Override
public LocalTime deserialize(JsonParser p, DeserializationContext deserializationContext)
throws IOException {
String value = p.getValueAsString();
if (value.contains(P)) {
return LocalTime.parse(value);
} else {
return LocalTime.parse(value, DateTimeFormatter.ofPattern(FORMATTER_TIME));
}
}
}
public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
@Override
public LocalDate deserialize(JsonParser p, DeserializationContext deserializationContext)
throws IOException {
String value = p.getValueAsString();
if (value.contains(H)) {
return LocalDate.parse(value, DateTimeFormatter.ofPattern(FORMATTER_DATE_H));
} else if (value.contains(S)) {
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
config.zip (2个子文件)
WebMvcConfig.java 4KB
JacksonConfig.java 9KB
共 2 条
- 1
软件精通
- 粉丝: 56
- 资源: 32
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0