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 extends Map> 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());
}