package com.ruoyi.account.wx.tools;
|
|
import com.fasterxml.jackson.core.JsonGenerator;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
import com.fasterxml.jackson.databind.JsonSerializer;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
|
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
|
import com.hotel.config.JacksonConfig;
|
import com.hotel.exception.ServiceException;
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.io.IOException;
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.time.format.DateTimeFormatter;
|
|
/**
|
* Json转换工具类
|
* 参考:https://blog.csdn.net/weixin_38413579/article/details/82562634
|
* @author madman
|
*/
|
@Slf4j
|
public final class JsonUtils {
|
|
private static final ObjectMapper OM = new ObjectMapper();
|
private static final JavaTimeModule timeModule = new JavaTimeModule();
|
|
/**
|
* 转换LocalDateTime
|
*/
|
static class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
|
@Override
|
public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
|
jsonGenerator.writeString(localDateTime.format(DateTimeFormatter.ofPattern(JacksonConfig.dateTimeFormat)));
|
}
|
}
|
|
/**
|
* 转换LocalDate
|
*/
|
static class LocalDateSerializer extends JsonSerializer<LocalDate> {
|
@Override
|
public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
|
jsonGenerator.writeString(localDate.format(DateTimeFormatter.ofPattern(JacksonConfig.dateFormat)));
|
}
|
}
|
|
/**
|
* 设置 ObjectMapper
|
*
|
* @return
|
*/
|
private static ObjectMapper getObjectMapper() {
|
// 序列化
|
timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
|
timeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
|
// 反序列化
|
timeModule.addDeserializer(LocalDateTime.class,
|
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(JacksonConfig.dateTimeFormat)));
|
timeModule.addDeserializer(LocalDate.class,
|
new LocalDateDeserializer(DateTimeFormatter.ofPattern(JacksonConfig.dateFormat)));
|
// 允许对象忽略json中不存在的属性
|
OM.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
OM.registerModule(timeModule);
|
return OM;
|
}
|
|
/**
|
* 将对象序列化
|
*/
|
public static <T> String toJsonString(T obj) {
|
try {
|
ObjectMapper om = getObjectMapper();
|
return om.writeValueAsString(obj);
|
} catch (JsonProcessingException e) {
|
log.error("转json字符串失败:{}", obj);
|
return null;
|
}
|
}
|
|
/**
|
* 反序列化对象字符串
|
*/
|
public static <T> T parseObject(String json, Class<T> clazz) {
|
try {
|
ObjectMapper om = getObjectMapper();
|
return om.readValue(json, clazz);
|
} catch (JsonProcessingException e) {
|
throw new ServiceException("反序列化对象字符串失败");
|
}
|
}
|
|
/**
|
* 反序列化字符串成为对象
|
*/
|
public static <T> T parseObject(String json, TypeReference<T> valueTypeRef) {
|
try {
|
ObjectMapper om = getObjectMapper();
|
return om.readValue(json, valueTypeRef);
|
} catch (JsonProcessingException e) {
|
throw new ServiceException("反序列化字符串成为对象失败");
|
}
|
}
|
|
}
|