jackson,用来序列化和反序列化 json 的 Java 的开源框架。
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.0</version> </dependency>
jackson配置
配置的目的是什么:
- 返回对象Ret中,如果有属性的值为null,需要做特殊处理;
- 针对jdk8的日期时间进行处理,自定义转换规则。解决传统的spring.jackson.date-format配置对LocalDate与LocalDateTime没有作用。
全局配置
在配置文件中配置
spring.jackson.default-property-inclusion=non_null 指定在将 Java 对象序列化为 JSON 时,应该如何处理对象中的
null
属性。
default-property-inclusion
: 这个属性设置了默认的属性包含规则,决定了在序列化过程中哪些属性应该被包括在最终的 JSON 输出中。
non_null
: 这个值表示只有在对象属性的值非null
时,这些属性才会被序列化到 JSON 中。换句话说,如果对象中的某个属性是null
,它将不会出现在 JSON 输出中。always
: 始终包括所有属性,不论其值是否为null
。non_default
: 只有当属性值不同于默认值时才包括它。non_empty
: 只有当属性值非空时才包括它(这适用于字符串、集合等)。对null和empty的解读
non_null
: 排除所有值为null
的属性。User user = new User(); user.setName(null); user.setAge(null);
non_empty
: 排除所有空值(包括null
、空字符串、空集合等)的属性。User user = new User(); user.setName(""); // 空字符串 user.setHobbies(new ArrayList<>()); // 空列表
应用场景:
User user = new User(); user.setName("John Doe"); user.setEmail(""); // 空字符串 user.setHobbies(new ArrayList<>()); // 空集合 { "name": "John Doe" } User user = new User(); user.setName("John Doe"); user.setEmail(null); // null 值 user.setAge(null); // null 值 { "name": "John Doe" }
#对日期类型的转换配置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
# 配置 参数如下 always non_absent non_default non_empty non_null use_defaults
spring.jackson.default-property-inclusion=non_null
注解配置
@JsonInclude(Include.NON_NULL)
- 在需要序列的话的实体类上加注解 ->[配置类型]所列
配置类
自定义序列化实现类,实现StdSerializer或者JsonSerializer
-
完成时间转化和对null值的过滤
ObjectMapper
是 Jackson 数据绑定库中的核心类,位于com.fasterxml.jackson.databind
包中。它用于将 Java 对象与 JSON 数据之间进行转换。下面是ObjectMapper
的主要作用和常用方法的详细说明:- 序列化(Serialization): 将 Java 对象转换为 JSON 格式的字符串或其他 JSON 形式的数据结构。
- 反序列化(Deserialization): 将 JSON 数据转换回 Java 对象。
- 配置(Configuration): 提供了丰富的配置选项,以控制序列化和反序列化的行为。
- 数据处理: 支持处理各种 JSON 数据,包括流、文件、字符串等。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
// 为mapper注册一个带有SerializerModifier的Factory,此modifier主要做的事情为:判断序列化类型,根据类型指定为null时的值
mapper.setSerializerFactory(mapper.getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier()));
// Java8日期时间处理
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
// 反序列化
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
//添加组件
mapper.registerModule(javaTimeModule);
//配置:jackson会序列化时,忽略未知属性,不报错。
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
}
}
- MyBeanSerializerModifier
public class MyBeanSerializerModifier extends BeanSerializerModifier {
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
for (BeanPropertyWriter writer : beanProperties) {
if (isArrayType(writer)) {
//
writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullArrayJsonSerializer());
}
if (isStringType(writer)) {
writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullStringJsonSerializer());
}
//default-property-inclusion: 这个属性设置了默认的属性包含规则,决定了在序列化过程中哪些属性应该被包括在最终的 JSON 输出中。
if (isNumberType(writer)) {
writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullNumberJsonSerializer());
}
if (isBooleanType(writer)) {
writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullBooleanJsonSerializer());
}
}
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 Boolean.class.isAssignableFrom(clazz);
}
}
package com.simceredx.report.common.config.json;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
/**
* 自定义null值序列化处理器
*/
public class CustomizeNullJsonSerializer {
/**
* 处理数组集合类型的null值
*/
public static class NullArrayJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartArray();
gen.writeEndArray();
}
}
/**
* 处理字符串类型的null值
*/
public static class NullStringJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeString("");
}
}
/**
* 处理数值类型的null值
*/
public static class NullNumberJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeNumber(0);
}
}
/**
* 处理boolean类型的null值
*/
public static class NullBooleanJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeBoolean(false);
}
}
}```