From 5ed3cbd4219110d2bfeca5f2e390ee0acd306d4a Mon Sep 17 00:00:00 2001 From: dimengzhe <251008545@qq.com> Date: Fri, 29 Apr 2022 19:47:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89null=E5=80=BC?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E5=A4=84=E7=90=86=E5=99=A8=E3=80=81?= =?UTF-8?q?=E9=85=8D=E7=BD=AEjackson=E5=AE=9E=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/CustomizeNullJsonSerializer.java | 72 +++++++++++++++++++ .../yxt/common/base/config/JacksonConfig.java | 23 ++++-- .../base/config/MyBeanSerializerModifier.java | 68 ++++++++++++++++++ 3 files changed, 156 insertions(+), 7 deletions(-) create mode 100644 yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/CustomizeNullJsonSerializer.java create mode 100644 yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/MyBeanSerializerModifier.java diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/CustomizeNullJsonSerializer.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/CustomizeNullJsonSerializer.java new file mode 100644 index 0000000..234c3b2 --- /dev/null +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/CustomizeNullJsonSerializer.java @@ -0,0 +1,72 @@ +package com.yxt.common.base.config; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +/** + * @Author dimengzhe + * @Date 2022/4/29 18:59 + * @Description + */ +public class CustomizeNullJsonSerializer { + + /** + * 处理数组集合类型的null值 + */ + public static class NullArrayJsonSerializer extends JsonSerializer { + @Override + public void serialize(Object value, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeStartArray(); + jsonGenerator.writeEndArray(); + } + } + + /** + * 处理字符串类型的null值 + */ + public static class NullStringJsonSerializer extends JsonSerializer { + @Override + public void serialize(Object value, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeString(""); + } + } + + /** + * 处理数值类型的null值 + */ + public static class NullNumberJsonSerializer extends JsonSerializer { + @Override + public void serialize(Object value, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeNumber(0); + } + } + + /** + * 处理boolean类型的null值 + */ + public static class NullBooleanJsonSerializer extends JsonSerializer { + @Override + public void serialize(Object value, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeBoolean(false); + } + } + + /** + * 处理实体对象类型的null值 + */ + /* public static class NullObjectJsonSerializer extends JsonSerializer { + @Override + public void serialize(Object value, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeStartObject(); + jsonGenerator.writeEndObject(); + } + }*/ +} diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/JacksonConfig.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/JacksonConfig.java index 214d345..5cf548d 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/JacksonConfig.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/JacksonConfig.java @@ -25,10 +25,6 @@ *********************************************************/ package com.yxt.common.base.config; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -37,8 +33,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; -import java.io.IOException; - /** * Project: yxt-common
* File: JacksonConfig.java
@@ -54,7 +48,7 @@ import java.io.IOException; */ @Configuration public class JacksonConfig { - @Bean + /* @Bean @Primary @ConditionalOnMissingBean(ObjectMapper.class) public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { @@ -68,6 +62,21 @@ public class JacksonConfig { } }); return objectMapper; + }*/ + + @Bean + @Primary + @ConditionalOnMissingBean(ObjectMapper.class) + public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { + ObjectMapper objectMapper = builder.createXmlMapper(false).build(); + /** 为objectMapper注册一个带有SerializerModifier的Factory */ + objectMapper.setSerializerFactory(objectMapper.getSerializerFactory() + .withSerializerModifier(new MyBeanSerializerModifier())); + + SerializerProvider serializerProvider = objectMapper.getSerializerProvider(); +// serializerProvider.setNullValueSerializer(new CustomizeNullJsonSerializer +// .NullObjectJsonSerializer()); + return objectMapper; } } diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/MyBeanSerializerModifier.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/MyBeanSerializerModifier.java new file mode 100644 index 0000000..e8192ee --- /dev/null +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/MyBeanSerializerModifier.java @@ -0,0 +1,68 @@ +package com.yxt.common.base.config; + +import com.fasterxml.jackson.databind.BeanDescription; +import com.fasterxml.jackson.databind.SerializationConfig; +import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; +import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; + +import java.util.Collection; +import java.util.List; + +/** + * @Author dimengzhe + * @Date 2022/4/29 18:58 + * @Description + */ +public class MyBeanSerializerModifier extends BeanSerializerModifier { + + @Override + public List changeProperties(SerializationConfig config, + BeanDescription beanDesc, + List beanProperties) { + // 循环所有的beanPropertyWriter + for (int i = 0; i < beanProperties.size(); i++) { + BeanPropertyWriter writer = beanProperties.get(i); + // 判断字段的类型,如果是数组或集合则注册nullSerializer + /* if (isArrayType(writer)) { + // 给writer注册一个自己的nullSerializer + writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullArrayJsonSerializer()); + }*/ + if (isStringType(writer)) { + writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullStringJsonSerializer()); + } + } + return beanProperties; + } + + /** + * 是否是数组 + */ + private boolean isArrayType(BeanPropertyWriter writer) { + Class clazz = writer.getType().getRawClass(); + return clazz.isArray() || Collection.class.isAssignableFrom(clazz); + } + + /** + * 是否是String + */ + private boolean isStringType(BeanPropertyWriter writer) { + Class clazz = writer.getType().getRawClass(); + return CharSequence.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz); + } + + /** + * 是否是数值类型 + */ + private boolean isNumberType(BeanPropertyWriter writer) { + Class clazz = writer.getType().getRawClass(); + return Number.class.isAssignableFrom(clazz); + } + + /** + * 是否是boolean + */ + private boolean isBooleanType(BeanPropertyWriter writer) { + Class clazz = writer.getType().getRawClass(); + return clazz.equals(Boolean.class); + } +}