[update] JsonUtil 升级优化,提供不同序列化反序列化的jsonmapper,处理反序列化时间值为空时的优化

This commit is contained in:
yexuejc007 2023-05-29 16:59:53 +08:00
parent 77a0e29916
commit a05bb00123
4 changed files with 84 additions and 13 deletions

View File

@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonDeserializer;
import com.yexuejc.base.constant.DateConsts; import com.yexuejc.base.constant.DateConsts;
import com.yexuejc.base.util.StrUtil;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDate; import java.time.LocalDate;
@ -22,6 +23,9 @@ public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException { throws IOException {
String timeString = jsonParser.getValueAsString(); String timeString = jsonParser.getValueAsString();
if (StrUtil.isEmpty(timeString)) {
return null;
}
if (timeString.contains(DateConsts.BAR)) { if (timeString.contains(DateConsts.BAR)) {
return LocalDate.parse(timeString, DateTimeFormatter.ISO_DATE); return LocalDate.parse(timeString, DateTimeFormatter.ISO_DATE);
} else if (timeString.contains(DateConsts.DATE_KEY_AM) } else if (timeString.contains(DateConsts.DATE_KEY_AM)

View File

@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonDeserializer;
import com.yexuejc.base.constant.DateConsts; import com.yexuejc.base.constant.DateConsts;
import com.yexuejc.base.util.StrUtil;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -21,6 +22,9 @@ public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException { throws IOException {
String timeString = jsonParser.getValueAsString(); String timeString = jsonParser.getValueAsString();
if (StrUtil.isEmpty(timeString)) {
return null;
}
if (timeString.contains(DateConsts.DATE_KEY_T)) { if (timeString.contains(DateConsts.DATE_KEY_T)) {
return LocalDateTime.parse(timeString, DateTimeFormatter.ISO_LOCAL_DATE_TIME); return LocalDateTime.parse(timeString, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
} else if (timeString.contains(DateConsts.DATE_KEY_AM) } else if (timeString.contains(DateConsts.DATE_KEY_AM)

View File

@ -1,16 +1,17 @@
package com.yexuejc.base.converter; 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.io.IOException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Locale; 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 * json转LocalDateTime
* *
@ -22,6 +23,9 @@ public class TimestampDeserializer extends JsonDeserializer<Timestamp> {
public Timestamp deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) public Timestamp deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException { throws IOException {
String timeString = jsonParser.getValueAsString(); String timeString = jsonParser.getValueAsString();
if (StrUtil.isEmpty(timeString)) {
return null;
}
if (timeString.contains(DateConsts.DATE_KEY_T)) { if (timeString.contains(DateConsts.DATE_KEY_T)) {
return Timestamp.valueOf(LocalDateTime.parse(timeString, DateTimeFormatter.ISO_LOCAL_DATE_TIME)); return Timestamp.valueOf(LocalDateTime.parse(timeString, DateTimeFormatter.ISO_LOCAL_DATE_TIME));
} else if (timeString.contains(DateConsts.DATE_KEY_AM) } else if (timeString.contains(DateConsts.DATE_KEY_AM)

View File

@ -1,6 +1,7 @@
package com.yexuejc.base.util; package com.yexuejc.base.util;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
@ -40,21 +41,16 @@ public class JsonUtil {
private static JsonMapper jsonMapper = new JsonMapper(); private static JsonMapper jsonMapper = new JsonMapper();
static { static {
JsonUtil.setJavaTimeModule(JsonUtil.jsonMapper);
JsonUtil.initDefaultObjectMapper(JsonUtil.jsonMapper); JsonUtil.initDefaultObjectMapper(JsonUtil.jsonMapper);
} }
/** /**
* 初始化ObjectMapper为默认属性 * 对时间的支持
* *
* @param jsonMapper * @param jsonMapper
*/ */
private static void initDefaultObjectMapper(ObjectMapper jsonMapper) { private static void setJavaTimeModule(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);
//设置一下时区可以和程序同步避免时区问题 //设置一下时区可以和程序同步避免时区问题
jsonMapper.setTimeZone(TimeZone.getDefault()); jsonMapper.setTimeZone(TimeZone.getDefault());
jsonMapper.setDateFormat(DateUtil.DATE_TIME_FORMAT); jsonMapper.setDateFormat(DateUtil.DATE_TIME_FORMAT);
@ -71,6 +67,69 @@ public class JsonUtil {
jsonMapper.registerModule(javaTime); jsonMapper.registerModule(javaTime);
} }
/**
* 初始化ObjectMapper为默认属性
* <pre>
* 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_PROPERTIESjson对应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
* </pre>
*
* @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的默认属性
* <pre>
* 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_PROPERTIESjson对应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
* </pre>
*
* @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 待优化 //TODO 待优化
public static void initSnakeCase() { public static void initSnakeCase() {
//驼峰下划线互转 //驼峰下划线互转