package com.ruoyi.system.utils.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 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 WxJsonUtils { public static final String dateFormat = "yyyy-MM-dd"; public static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; private static final ObjectMapper OM = new ObjectMapper(); private static final JavaTimeModule timeModule = new JavaTimeModule(); /** * 转换LocalDateTime */ static class LocalDateTimeSerializer extends JsonSerializer { @Override public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeString(localDateTime.format(DateTimeFormatter.ofPattern(dateTimeFormat))); } } /** * 转换LocalDate */ static class LocalDateSerializer extends JsonSerializer { @Override public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeString(localDate.format(DateTimeFormatter.ofPattern(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(dateTimeFormat))); timeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(dateFormat))); // 允许对象忽略json中不存在的属性 OM.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); OM.registerModule(timeModule); return OM; } /** * 将对象序列化 */ public static String toJsonString(T obj) { try { ObjectMapper om = getObjectMapper(); return om.writeValueAsString(obj); } catch (JsonProcessingException e) { log.error("转json字符串失败:{}", obj); return null; } } /** * 反序列化对象字符串 */ public static T parseObject(String json, Class clazz) { try { ObjectMapper om = getObjectMapper(); return om.readValue(json, clazz); } catch (JsonProcessingException e) { throw new RuntimeException("反序列化对象字符串失败"); } } /** * 反序列化字符串成为对象 */ public static T parseObject(String json, TypeReference valueTypeRef) { try { ObjectMapper om = getObjectMapper(); return om.readValue(json, valueTypeRef); } catch (JsonProcessingException e) { throw new RuntimeException("反序列化字符串成为对象失败"); } } }