| package com.ruoyi.system.utils; | 
|   | 
| 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.ruoyi.common.exception.ServiceException; | 
| import com.ruoyi.system.utils.wx.config.JacksonConfig; | 
| 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("反序列化字符串成为对象失败"); | 
|         } | 
|     } | 
|   | 
| } |