jackson在springboot中使用

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 的主要作用和常用方法的详细说明:

    1. 序列化(Serialization): 将 Java 对象转换为 JSON 格式的字符串或其他 JSON 形式的数据结构。
    2. 反序列化(Deserialization): 将 JSON 数据转换回 Java 对象。
    3. 配置(Configuration): 提供了丰富的配置选项,以控制序列化和反序列化的行为。
    4. 数据处理: 支持处理各种 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);
        }
    }
}```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值