From a05bb00123a5008196161b0d1e20b4760fd481fe Mon Sep 17 00:00:00 2001 From: yexuejc007 Date: Mon, 29 May 2023 16:59:53 +0800 Subject: [PATCH] =?UTF-8?q?[update]=20JsonUtil=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E6=8F=90=E4=BE=9B=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96?= =?UTF-8?q?=E7=9A=84jsonmapper,=E5=A4=84=E7=90=86=E5=8F=8D=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E6=97=B6=E9=97=B4=E5=80=BC=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/converter/LocalDateDeserializer.java | 4 + .../converter/LocalDateTimeDeserializer.java | 4 + .../base/converter/TimestampDeserializer.java | 14 ++-- .../java/com/yexuejc/base/util/JsonUtil.java | 75 +++++++++++++++++-- 4 files changed, 84 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/yexuejc/base/converter/LocalDateDeserializer.java b/src/main/java/com/yexuejc/base/converter/LocalDateDeserializer.java index dca2255..9fc5211 100644 --- a/src/main/java/com/yexuejc/base/converter/LocalDateDeserializer.java +++ b/src/main/java/com/yexuejc/base/converter/LocalDateDeserializer.java @@ -4,6 +4,7 @@ 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 com.yexuejc.base.util.StrUtil; import java.io.IOException; import java.time.LocalDate; @@ -22,6 +23,9 @@ public class LocalDateDeserializer extends JsonDeserializer { public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { String timeString = jsonParser.getValueAsString(); + if (StrUtil.isEmpty(timeString)) { + return null; + } if (timeString.contains(DateConsts.BAR)) { return LocalDate.parse(timeString, DateTimeFormatter.ISO_DATE); } else if (timeString.contains(DateConsts.DATE_KEY_AM) diff --git a/src/main/java/com/yexuejc/base/converter/LocalDateTimeDeserializer.java b/src/main/java/com/yexuejc/base/converter/LocalDateTimeDeserializer.java index 36252f9..6987010 100644 --- a/src/main/java/com/yexuejc/base/converter/LocalDateTimeDeserializer.java +++ b/src/main/java/com/yexuejc/base/converter/LocalDateTimeDeserializer.java @@ -4,6 +4,7 @@ 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 com.yexuejc.base.util.StrUtil; import java.io.IOException; import java.time.LocalDateTime; @@ -21,6 +22,9 @@ public class LocalDateTimeDeserializer extends JsonDeserializer { public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { String timeString = jsonParser.getValueAsString(); + if (StrUtil.isEmpty(timeString)) { + return null; + } if (timeString.contains(DateConsts.DATE_KEY_T)) { return LocalDateTime.parse(timeString, DateTimeFormatter.ISO_LOCAL_DATE_TIME); } else if (timeString.contains(DateConsts.DATE_KEY_AM) diff --git a/src/main/java/com/yexuejc/base/converter/TimestampDeserializer.java b/src/main/java/com/yexuejc/base/converter/TimestampDeserializer.java index 86f8426..53a2c50 100644 --- a/src/main/java/com/yexuejc/base/converter/TimestampDeserializer.java +++ b/src/main/java/com/yexuejc/base/converter/TimestampDeserializer.java @@ -1,16 +1,17 @@ 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 com.yexuejc.base.util.StrUtil; + 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 * @@ -22,6 +23,9 @@ public class TimestampDeserializer extends JsonDeserializer { public Timestamp deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { String timeString = jsonParser.getValueAsString(); + if (StrUtil.isEmpty(timeString)) { + return null; + } 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) diff --git a/src/main/java/com/yexuejc/base/util/JsonUtil.java b/src/main/java/com/yexuejc/base/util/JsonUtil.java index 9ee3015..0dd77dc 100644 --- a/src/main/java/com/yexuejc/base/util/JsonUtil.java +++ b/src/main/java/com/yexuejc/base/util/JsonUtil.java @@ -1,6 +1,7 @@ package com.yexuejc.base.util; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; @@ -40,21 +41,16 @@ public class JsonUtil { private static JsonMapper jsonMapper = new JsonMapper(); static { + JsonUtil.setJavaTimeModule(JsonUtil.jsonMapper); JsonUtil.initDefaultObjectMapper(JsonUtil.jsonMapper); } /** - * 初始化ObjectMapper为默认属性 + * 对时间的支持 * * @param jsonMapper */ - 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); + private static void setJavaTimeModule(ObjectMapper jsonMapper) { //设置一下时区,可以和程序同步避免时区问题 jsonMapper.setTimeZone(TimeZone.getDefault()); jsonMapper.setDateFormat(DateUtil.DATE_TIME_FORMAT); @@ -71,6 +67,69 @@ public class JsonUtil { jsonMapper.registerModule(javaTime); } + /** + * 初始化ObjectMapper为默认属性 + *
+     *     1.序列化值为空时,NON_NULL:舍去字段
+     *     2.JsonParser.Feature.ALLOW_SINGLE_QUOTES:解析JSON时允许使用单引号(')作为字符串的引号(true)
+     *          例子:{'localDateTime':'2023-05-29T15:32:03.9770447'}
+     *     3.JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES:解析JSON时允许不使用引号作为字符串的引号(true)
+     *          例子:{age:12};适用于基本数据类型
+     *     4.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES:json对应java Bean,数据字段对不齐的情况下不报错(false)
+     *     5.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS(false):用于指定是否将日期类型序列化为时间戳格式。如果启用该特性,则日期类型将被序列化为Unix时间戳(即从1970年1月1日00:00:00 GMT开始的毫秒数)。如果禁用该特性,则日期类型将以其原始格式进行序列化。
+     *          例子(false):"timestamp": "2020-07-08T02:02:55.000+00:00"
+     *          例子(true):"timestamp": 1594236175000
+     * 
+ * + * @param jsonMapper + */ + 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的默认属性 + *
+     *     1.序列化值为空时,ALWAYS:保留字段,值为“”
+     *     2.JsonParser.Feature.ALLOW_SINGLE_QUOTES:解析JSON时允许使用单引号(')作为字符串的引号(true)
+     *          例子:{'localDateTime':'2023-05-29T15:32:03.9770447'}
+     *     3.JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES:解析JSON时允许不使用引号作为字符串的引号(true)
+     *          例子:{age:12};适用于基本数据类型
+     *     4.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES:json对应java Bean,数据字段对不齐的情况下不报错(false)
+     *     5.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS(false):用于指定是否将日期类型序列化为时间戳格式。如果启用该特性,则日期类型将被序列化为Unix时间戳(即从1970年1月1日00:00:00 GMT开始的毫秒数)。如果禁用该特性,则日期类型将以其原始格式进行序列化。
+     *          例子(false):"timestamp": "2020-07-08T02:02:55.000+00:00"
+     *          例子(true):"timestamp": 1594236175000
+     *     6.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT:反序列化值为空时,映射到java Bean 非字符串类型,值为:null
+     * 
+ * + * @return + */ + public static ObjectMapper acceptEmptyStringAsNullObject() { + JsonMapper jsonMapper = new JsonMapper(); + setJavaTimeModule(jsonMapper); + //值为空时,ALWAYS:保留字段,默认字符串值为“”,对象值为null + jsonMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); + 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); + jsonMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true); + + //值为空时,序列化所有值为“” + jsonMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<>() { + @Override + public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeString(""); + } + }); + return jsonMapper; + } + //TODO 待优化 public static void initSnakeCase() { //驼峰下划线互转