Springboot jackSon -序列化-详解

摘要:
如果项目中发生了什么,则不需要序列化值为NULL的对象中的字段。输入配置方法如下:[ConfigurationType]:源代码包中的枚举类:publicstaticenumInclude{ALWAYS,NON_NULL,NON_ABSENT,NONE_EMPTY,NON_DEFAULT,USE_DEFAULTS;privateInclud(){}}包括。始终默认包括。非DEFAU

在项目中有事需要对值为NULL的对象中Field不做序列化输入配置方式如下:

[配置类型]:

源码包中的枚举类:

public static enumInclude {
    ALWAYS,
    NON_NULL,
    NON_ABSENT,
    NON_EMPTY,
    NON_DEFAULT,
    USE_DEFAULTS;
 
    privateInclude() {
    }
}

Include.Include.ALWAYS 默认
Include.NON_DEFAULT 属性为默认值不序列化
Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
Include.NON_NULL 属性为NULL 不序列化

方式一:全局配置,处理所有整个应用的实体对象

#对日期类型的转换配置
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)

方式三:配置类型

3.1自定义序列化实现类,可以作用在类上自定义json序列化需要实现StdSerializer<T>或者JsonSerializer<T>

@JsonSerialize(using = ClientObjectSerialize.class)
public classCreditBorrowerRepaymentRequestDto{
}

实现类:对字段类型转换,以及对值为null字段的过滤

public class ClientObjectSerialize extends JsonSerializer<CreditBorrowerRepaymentRequestDto>{
 
    @Override
    public void serialize(CreditBorrowerRepaymentRequestDto dto, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throwsIOException, JsonProcessingException {
 
        jsonGenerator.writeStartObject();
        try{
            Field[] fields =dto.getClass().getDeclaredFields();
            for(Field field : fields) {
                field.setAccessible(true);
                if(null ==field.get(dto)){
                    continue; 
                }
                jsonGenerator.writeFieldName(field.getName());
                jsonGenerator.writeObject(field.get(dto));
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
        jsonGenerator.writeEndObject();
    }
}

3.2自定义序列化实现类,可以作用在实体对象字段上,对NULL值的处理,或者转换

@JsonSerialize(using = ClientStringSerialize.class)
privateString name;
 
@JsonSerialize(using = ClientDtaeSerialize.class)
private Date date;
public class ClientStringSerialize extends JsonSerializer<String>{
 
    @Override
    public void serialize(String string, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throwsIOException {
 
        if(string == null){
            jsonGenerator.writeString(string + "[NULL]");
        }else{
            jsonGenerator.writeString(string);
        }
    }
}
public class ClientDtaeSerialize extends JsonSerializer<Date>{
    @Override
    public void serialize(Date createDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throwsIOException {
        jsonGenerator.writeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createDate));
    }
}

实践总结:

一当全局配置了NULL字段过滤的配置,但有的实体对象需要序列化出NULL的字段值,如何处理?

答: 1. 直接在对象上增加@JsonInclude(JsonInclude.Include.ALWAYS) 类上的注解优先级比较高,会覆盖全局的配置

2.用自定义的类序列化注解(同上)

二直接在字段上加自定义序列化类会覆盖全局配置吗?

答:不会,有默认的 public class NullSerializer extends StdSerializer<Object> 来处理,当值不为Null的时候才会执行自定义字段上的序列化注解实现类

免责声明:文章转载自《Springboot jackSon -序列化-详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux学习之Linux目录及文件系统MySQL发展和技术选型——《MySQL DBA 工作笔记》下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【DLL相关】实现函数的DLL封装,并在另一个项目中调用

直接给出步骤: ===========函数的DLL封装=========== 1.创建第一个项目:win32控制台程序,应用程序类型:DLL,附加选项:导出符号(命名:double_dll) 2.double_dll.h中加入函数定义   extern DOUBLE_DLL_API int doublefun(int);//DOUBLE_DLL_API 根...

11-14序列化模块之json、pickle、shelve

序列化的目的 1、以某种存储形式使自定义对象持久化; 2、将对象从一个地方传递到另一个地方。 3、使程序更具维护性。 序列化--转向一个字符串数据类型序列--及时字符串何处用到:  数据存储  网络上传输的时候从数据类型到字符串的过程,叫做序列化从字符串到数据类型的过程,叫做反序列化分类 json ***** pickle ****...

Protobuf 语言指南(proto3)

Protobuf 语言指南(proto3)Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单。您可以定义数据的结构化,然后可以使用特殊生成的源代码轻松地在各种数据流中使用各种语言编写和读取结构化数据。 定义消息类型 先来看一个非常简单的例子。假设你想定义一个“搜索...

Jackson总结:常用注解、整合spring、自定义JsonSerializer

转自Jackson总结:常用注解、整合spring、自定义JsonSerializer Jackson作为springMVC默认的MessageConverter(消息序列化工具),经常在项目中使用,如果熟悉Jackson常用的使用方法,特性化机制,就会事半功倍,极大提高前后端数据交互的灵活性。 maven依赖 <dependency>...

php的serialize序列化和json性能测试

最近需要对大数组做存储,需要在serialize序列化和json之间做了选择。因此需要做了性能测试。 在php5.2之前对数组存储的时候,大都使用serialize系列化。php5.2之后,开始内置了 JSON 的支持。 在网上看到有些资料说:json_encode和json_decode比内置的serialize和unserialize函数要高效。耳闻不...

Linux路径名和文件名最大长度限制

UNIX标准对路径名和文件名最大长度限制做出了说明,但其上限值在实际应用长过小,Linux在具体实现时提升了该上限,该限制在Linux的 /usr/include/linux/limits.h 中做出了说明,具体如下: 1 #ifndef _LINUX_LIMITS_H 2 #define _LINUX_LIMITS_H 3 4 #define...