public class JsonProvider {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private static final JavaTimeModule JAVA_TIME_MODULE = new JavaTimeModule();
static {
JAVA_TIME_MODULE.addSerializer(LocalDateTime.class, new JsonLocalDateTimeSupport.LocalDateTimeSerializer());
JAVA_TIME_MODULE.addDeserializer(LocalDateTime.class, new JsonLocalDateTimeSupport.LocalDateTimeDeserializer());
OBJECT_MAPPER.registerModule(JAVA_TIME_MODULE);
}
public static ObjectMapper getJson() {
return OBJECT_MAPPER;
}
public static JavaTimeModule getJavaTimeModule() {
return JAVA_TIME_MODULE;
}
}
这里添加了一个关于LocalDateTime的序列化反序列化,项目权局避免使用Date,所以直接不做处理,只需要权局规范好LocalDateTime,可以按需添加.
附上LocalDateTime的操作:
public interface JsonLocalDateTimeSupport {
// 序列化实现
final class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime localDateTime, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
if (localDateTime != null) {
long timestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
gen.writeNumber(timestamp);
}
}
}
// 反序列化实现
final class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext)
throws IOException {
long timestamp = p.getValueAsLong();
if (timestamp > 0) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());
} else {
return null;
}
}
}
}
对JsonPrivoder继续包装一层,方便代码中使用
@Slf4j
public class JsonSupport {
private static final ObjectMapper OBJECTMAPPER = JsonProvider.getJson();
private JsonSupport() {
}
private static ObjectMapper getObjectMapper() {
return OBJECTMAPPER;
}
public static TypeFactory getTypeFactory() {
return OBJECTMAPPER.getTypeFactory();
}
/**
* 执行操作
*
* @param callable 操作
* @param <T> 返回泛型
* @return 返回
*/
public static <T> T tryDo(Callable<T> callable) {
try {
return callable.call();
} catch (Exception e) {
log.error("Json转换错误", e);
throw new BusinessException(DATA_EXCEPTION, e);
}
}
public static <T> T parse(String json, Class<T> clz) {
return tryDo(() -> getObjectMapper().readValue(json, clz));
}
public static <T> T parseType(String json, JavaType javaType) {
return tryDo(() -> getObjectMapper().readValue(json, javaType));
}
public static <K, V> Map<K, V> parseMap(String json, Class<K> kClass, Class<V> vClass) {
return parseType(json, getTypeFactory().constructMapType(Map.class, kClass, vClass));
}
public static <T> List<T> parseList(String json, Class<T> clz) {
return parseType(json, getTypeFactory().constructCollectionType(List.class, clz));
}
public static String toJson(Object obj) {
return tryDo(() -> getObjectMapper().writeValueAsString(obj));
}
}
附上springmvc的localdateTime处理 (springboot 2.7)
@Configuration
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//统一返回值处理
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
.modules(JsonProvider.getJavaTimeModule())
.build();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(objectMapper);
converters.replaceAll(c -> c instanceof MappingJackson2HttpMessageConverter ? converter : c);
}
}
附上Redis序列化补充操作
@Configuration
public class RedisConfig extends CachingConfigurerSupport implements Serializable {
@Bean(name = "jsonRedisTemplate")
public RedisTemplate<String, Object> jsonRedisTemplate(RedisConnectionFactory factory) {
final RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
// 设置Key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
final Jackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.registerModule(JsonProvider.getJavaTimeModule());
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(new LaissezFaireSubTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
jsonRedisSerializer.setObjectMapper(objectMapper);
// 设置Value的序列化器
redisTemplate.setValueSerializer(jsonRedisSerializer);
//hash的序列化器
redisTemplate.setHashKeySerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
// 使配置生效
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}