package com.jilongda.common.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.jilongda.common.config.JacksonConfig; import com.jilongda.common.exception.ServerException; 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(); /** * 设置 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 String toJsonString(T obj) { try { ObjectMapper om = getObjectMapper(); return om.writeValueAsString(obj); } catch (JsonProcessingException e) { log.error("转json字符串失败:{}", obj); e.printStackTrace(); throw new ServerException("转json字符串失败"); } } /** * 反序列化对象字符串 */ public static T parseObject(String json, Class clazz) { try { ObjectMapper om = getObjectMapper(); return om.readValue(json, clazz); } catch (JsonProcessingException e) { throw new ServerException("反序列化对象字符串失败"); } } /** * 反序列化字符串成为对象 */ public static T parseObject(String json, TypeReference valueTypeRef) { try { ObjectMapper om = getObjectMapper(); return om.readValue(json, valueTypeRef); } catch (JsonProcessingException e) { throw new ServerException("反序列化字符串成为对象失败"); } } /** * 转换LocalDateTime */ static class LocalDateTimeSerializer extends JsonSerializer { @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 { @Override public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeString(localDate.format(DateTimeFormatter.ofPattern(JacksonConfig.dateFormat))); } } }