diff --git a/pom.xml b/pom.xml index 159f31d..1b99f57 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ top.yexuejc yexuejc-base - 1.5.1-jdk11 + 1.5.2-jdk11 yexuejc-base https://github.com/yexuejc/yexuejc-base @@ -51,8 +51,8 @@ 1.70 31.1-jre 5.2.2 - 2.14.0 - 2.11.2 + 2.14.2 + 2.11.4 UTF-8 UTF-8 @@ -118,6 +118,11 @@ jackson-dataformat-csv ${jackson.version} + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + net.lingala.zip4j @@ -128,7 +133,7 @@ org.junit.jupiter junit-jupiter-api - 5.9.0 + 5.9.2 test diff --git a/src/main/java/com/yexuejc/base/constant/DateConsts.java b/src/main/java/com/yexuejc/base/constant/DateConsts.java new file mode 100644 index 0000000..57509d1 --- /dev/null +++ b/src/main/java/com/yexuejc/base/constant/DateConsts.java @@ -0,0 +1,21 @@ +package com.yexuejc.base.constant; + +/** + * @author yexuejc + * @class-name DateConsts + * @description + * @date 2023/05/17 13:45 + */ +public class DateConsts { + public static final String BAR = "-"; + public static final CharSequence DATE_KEY_AM = "AM"; + public static final CharSequence DATE_KEY_PM = "PM"; + public static final String DATE_TIMESTAMP_LINUX = "M/dd/yy, h:mm a"; + public static final CharSequence SLASH = "/"; + public static final CharSequence COLON = ":"; + public static final String DATE_YYYY_MM_DD_SLASH = "yyyy/MM/dd"; + public static final CharSequence DATE_KEY_T = "T"; + public static final String DATE_KEY_Z = "Z"; + public static final String DATE_TIMESTAMP = "yyyy/MM/dd H:m:s"; + public static final String DATE_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; +} diff --git a/src/main/java/com/yexuejc/base/converter/LocalDateDeserializer.java b/src/main/java/com/yexuejc/base/converter/LocalDateDeserializer.java new file mode 100644 index 0000000..dca2255 --- /dev/null +++ b/src/main/java/com/yexuejc/base/converter/LocalDateDeserializer.java @@ -0,0 +1,40 @@ +package com.yexuejc.base.converter; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.yexuejc.base.constant.DateConsts; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +/** + * json转LocalDate + * + * @author yexuejc + * @date 2022/10/08 + */ +public class LocalDateDeserializer extends JsonDeserializer { + + @Override + public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException { + String timeString = jsonParser.getValueAsString(); + if (timeString.contains(DateConsts.BAR)) { + return LocalDate.parse(timeString, DateTimeFormatter.ISO_DATE); + } else if (timeString.contains(DateConsts.DATE_KEY_AM) + || timeString.contains(DateConsts.DATE_KEY_PM)) { + return LocalDate.parse(timeString, + DateTimeFormatter.ofPattern(DateConsts.DATE_TIMESTAMP_LINUX, Locale.ENGLISH)); + } else if (timeString.contains(DateConsts.SLASH) && timeString.contains(DateConsts.COLON)) { + return LocalDate.parse(timeString.substring(0, 10), + DateTimeFormatter.ofPattern(DateConsts.DATE_YYYY_MM_DD_SLASH)); + } else if (timeString.contains(DateConsts.SLASH)) { + return LocalDate.parse(timeString, DateTimeFormatter.ofPattern(DateConsts.DATE_YYYY_MM_DD_SLASH)); + } else { + return LocalDate.parse(timeString, DateTimeFormatter.BASIC_ISO_DATE); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/yexuejc/base/converter/LocalDateSerializer.java b/src/main/java/com/yexuejc/base/converter/LocalDateSerializer.java new file mode 100644 index 0000000..d9f7625 --- /dev/null +++ b/src/main/java/com/yexuejc/base/converter/LocalDateSerializer.java @@ -0,0 +1,23 @@ +package com.yexuejc.base.converter; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +/** + * localDate转json + * + * @author yexuejc + * @date 2022/10/08 + */ +public class LocalDateSerializer extends JsonSerializer { + @Override + public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) + throws IOException { + jsonGenerator.writeString(localDate.format(DateTimeFormatter.ISO_DATE)); + } +} \ No newline at end of file diff --git a/src/main/java/com/yexuejc/base/converter/LocalDateTimeDeserializer.java b/src/main/java/com/yexuejc/base/converter/LocalDateTimeDeserializer.java new file mode 100644 index 0000000..36252f9 --- /dev/null +++ b/src/main/java/com/yexuejc/base/converter/LocalDateTimeDeserializer.java @@ -0,0 +1,40 @@ +package com.yexuejc.base.converter; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.yexuejc.base.constant.DateConsts; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +/** + * json转LocalDateTime + * + * @author yexuejc + * @date 2022/10/08 + */ +public class LocalDateTimeDeserializer extends JsonDeserializer { + @Override + public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException { + String timeString = jsonParser.getValueAsString(); + if (timeString.contains(DateConsts.DATE_KEY_T)) { + return LocalDateTime.parse(timeString, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } else if (timeString.contains(DateConsts.DATE_KEY_AM) + || timeString.contains(DateConsts.DATE_KEY_PM)) { + return LocalDateTime.parse(timeString, + DateTimeFormatter.ofPattern(DateConsts.DATE_TIMESTAMP_LINUX, Locale.ENGLISH)); + } else if (timeString.endsWith(DateConsts.DATE_KEY_Z)) { + return LocalDateTime.parse(timeString, DateTimeFormatter.ISO_INSTANT); + } else if (timeString.contains(DateConsts.SLASH)) { + return LocalDateTime.parse(timeString, DateTimeFormatter.ofPattern(DateConsts.DATE_TIMESTAMP)); + } else { + return LocalDateTime.parse(timeString, + DateTimeFormatter.ofPattern(DateConsts.DATE_YYYY_MM_DD_HH_MM_SS)); + } + } + +} diff --git a/src/main/java/com/yexuejc/base/converter/LocalDateTimeSerializer.java b/src/main/java/com/yexuejc/base/converter/LocalDateTimeSerializer.java new file mode 100644 index 0000000..fc3c497 --- /dev/null +++ b/src/main/java/com/yexuejc/base/converter/LocalDateTimeSerializer.java @@ -0,0 +1,23 @@ +package com.yexuejc.base.converter; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +/** + * LocalDateTime转json + * + * @author yexuejc + * @date 2022/10/08 + */ +public class LocalDateTimeSerializer extends JsonSerializer { + @Override + public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeString(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + } +} \ No newline at end of file diff --git a/src/main/java/com/yexuejc/base/converter/TimestampDeserializer.java b/src/main/java/com/yexuejc/base/converter/TimestampDeserializer.java new file mode 100644 index 0000000..86f8426 --- /dev/null +++ b/src/main/java/com/yexuejc/base/converter/TimestampDeserializer.java @@ -0,0 +1,42 @@ +package com.yexuejc.base.converter; + +import java.io.IOException; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.yexuejc.base.constant.DateConsts; + +/** + * json转LocalDateTime + * + * @author yexuejc + * @date 2022/10/08 + */ +public class TimestampDeserializer extends JsonDeserializer { + @Override + public Timestamp deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException { + String timeString = jsonParser.getValueAsString(); + if (timeString.contains(DateConsts.DATE_KEY_T)) { + return Timestamp.valueOf(LocalDateTime.parse(timeString, DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + } else if (timeString.contains(DateConsts.DATE_KEY_AM) + || timeString.contains(DateConsts.DATE_KEY_PM)) { + return Timestamp.valueOf(LocalDateTime.parse(timeString, + DateTimeFormatter.ofPattern(DateConsts.DATE_TIMESTAMP_LINUX, Locale.ENGLISH))); + } else if (timeString.endsWith(DateConsts.DATE_KEY_Z)) { + return Timestamp.valueOf(LocalDateTime.parse(timeString, DateTimeFormatter.ISO_INSTANT)); + } else if (timeString.contains(DateConsts.SLASH)) { + return Timestamp.valueOf( + LocalDateTime.parse(timeString, DateTimeFormatter.ofPattern(DateConsts.DATE_TIMESTAMP))); + } else { + return Timestamp.valueOf(LocalDateTime.parse(timeString, + DateTimeFormatter.ofPattern(DateConsts.DATE_YYYY_MM_DD_HH_MM_SS))); + } + } + +} diff --git a/src/main/java/com/yexuejc/base/converter/TimestampSerializer.java b/src/main/java/com/yexuejc/base/converter/TimestampSerializer.java new file mode 100644 index 0000000..d4262b2 --- /dev/null +++ b/src/main/java/com/yexuejc/base/converter/TimestampSerializer.java @@ -0,0 +1,25 @@ +package com.yexuejc.base.converter; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.yexuejc.base.constant.DateConsts; + +import java.io.IOException; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; + +/** + * Timestamp转json + * + * @author yexuejc + * @date 2022/10/08 + */ +public class TimestampSerializer extends JsonSerializer { + @Override + public void serialize(Timestamp timestamp, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) + throws IOException { + SimpleDateFormat df = new SimpleDateFormat(DateConsts.DATE_TIMESTAMP); + jsonGenerator.writeString(df.format(timestamp)); + } +} \ No newline at end of file diff --git a/src/main/java/com/yexuejc/base/util/JsonUtil.java b/src/main/java/com/yexuejc/base/util/JsonUtil.java index faa5fe8..9ee3015 100644 --- a/src/main/java/com/yexuejc/base/util/JsonUtil.java +++ b/src/main/java/com/yexuejc/base/util/JsonUtil.java @@ -1,16 +1,21 @@ package com.yexuejc.base.util; - import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.type.MapType; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.yexuejc.base.converter.*; import java.io.IOException; import java.io.InputStream; +import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Map; import java.util.TimeZone; import java.util.logging.Logger; @@ -32,32 +37,44 @@ public class JsonUtil { /** * 作为单例全局使用 */ - private static ObjectMapper objectMapper = new ObjectMapper(); + private static JsonMapper jsonMapper = new JsonMapper(); static { - JsonUtil.initDefaultObjectMapper(JsonUtil.objectMapper); + JsonUtil.initDefaultObjectMapper(JsonUtil.jsonMapper); } /** * 初始化ObjectMapper为默认属性 * - * @param objectMapper + * @param jsonMapper */ - private static void initDefaultObjectMapper(ObjectMapper objectMapper) { - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); - objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + private static void initDefaultObjectMapper(ObjectMapper jsonMapper) { + //值为空时,NON_NULL:舍去字段;ALWAYS:保留字段,值为“” + jsonMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + jsonMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); + jsonMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); + jsonMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + jsonMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); //设置一下时区,可以和程序同步避免时区问题 - objectMapper.setTimeZone(TimeZone.getDefault()); - objectMapper.setDateFormat(DateUtil.DATE_TIME_FORMAT); + jsonMapper.setTimeZone(TimeZone.getDefault()); + jsonMapper.setDateFormat(DateUtil.DATE_TIME_FORMAT); + + JavaTimeModule javaTime = new JavaTimeModule(); + //java time 特殊处理 + javaTime.addSerializer(LocalDate.class, new LocalDateSerializer()); + javaTime.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer()); + javaTime.addSerializer(Timestamp.class, new TimestampSerializer()); + + javaTime.addDeserializer(LocalDate.class, new LocalDateDeserializer()); + javaTime.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer()); + javaTime.addDeserializer(Timestamp.class, new TimestampDeserializer()); + jsonMapper.registerModule(javaTime); } //TODO 待优化 public static void initSnakeCase() { //驼峰下划线互转 - objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); + jsonMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); } /** @@ -86,8 +103,8 @@ public class JsonUtil { * * @return */ - public static ObjectMapper getObjectMapper() { - return objectMapper; + public static ObjectMapper getJsonMapper() { + return jsonMapper; } /** @@ -101,7 +118,7 @@ public class JsonUtil { T pojo = null; try { - pojo = objectMapper.readValue(json, cls); + pojo = jsonMapper.readValue(json, cls); } catch (JsonParseException e) { log.warning("json to Object JsonParseException.\n" + e.getMessage()); } catch (JsonMappingException e) { @@ -123,7 +140,7 @@ public class JsonUtil { public static T json2Obj(String json, Class cls) { T pojo = null; try { - pojo = objectMapper.readValue(json, cls); + pojo = jsonMapper.readValue(json, cls); } catch (JsonParseException e) { log.warning("json to Object JsonParseException.\n" + e.getMessage()); } catch (JsonMappingException e) { @@ -147,9 +164,9 @@ public class JsonUtil { */ public static T json2Obj(String json, Class parametrized, Class... parameterClasses) { T pojo = null; - JavaType javaType = objectMapper.getTypeFactory().constructParametricType(parametrized, parameterClasses); + JavaType javaType = jsonMapper.getTypeFactory().constructParametricType(parametrized, parameterClasses); try { - pojo = objectMapper.readValue(json, javaType); + pojo = jsonMapper.readValue(json, javaType); } catch (JsonParseException e) { log.warning("json to Object JsonParseException.\n" + e.getMessage()); } catch (JsonMappingException e) { @@ -172,9 +189,9 @@ public class JsonUtil { */ public static T json2Obj(String json, Class mapClass, Class keyClass, Class valueClass) { T pojo = null; - MapType mapType = objectMapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass); + MapType mapType = jsonMapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass); try { - pojo = objectMapper.readValue(json, mapType); + pojo = jsonMapper.readValue(json, mapType); } catch (JsonParseException e) { log.warning("json to Object JsonParseException.\n" + e.getMessage()); } catch (JsonMappingException e) { @@ -195,7 +212,7 @@ public class JsonUtil { */ public static T json2Obj(String json, TypeReference javaType) { try { - return objectMapper.readValue(json, javaType); + return jsonMapper.readValue(json, javaType); } catch (JsonProcessingException e) { log.warning("json to Object JsonParseException.\n" + e.getMessage()); } @@ -212,10 +229,10 @@ public class JsonUtil { */ public static T json2Obj(InputStream json, Class parametrized, Class... parameterClasses) { T pojo = null; - JavaType javaType = objectMapper.getTypeFactory().constructParametrizedType(parametrized, parametrized, + JavaType javaType = jsonMapper.getTypeFactory().constructParametrizedType(parametrized, parametrized, parameterClasses); try { - pojo = objectMapper.readValue(json, javaType); + pojo = jsonMapper.readValue(json, javaType); } catch (JsonParseException e) { log.warning("json to Object JsonParseException.\n" + e.getMessage()); } catch (JsonMappingException e) { @@ -235,7 +252,7 @@ public class JsonUtil { public static String obj2Json(Object pojo) { String json = null; try { - json = objectMapper.writeValueAsString(pojo); + json = jsonMapper.writeValueAsString(pojo); } catch (JsonProcessingException e) { log.warning("json to Object JsonProcessingException.\n" + e.getMessage()); } @@ -251,7 +268,7 @@ public class JsonUtil { public static String formatPrinter(Object obj) { String json = null; try { - json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); + json = jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); } catch (JsonProcessingException e) { log.warning("json to Object JsonProcessingException.\n" + e.getMessage()); }