zoukankan      html  css  js  c++  java
  • Springboot jackSon -序列化-详解

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

    [配置类型]:

    源码包中的枚举类:

    public static enum Include {
        ALWAYS,
        NON_NULL,
        NON_ABSENT,
        NON_EMPTY,
        NON_DEFAULT,
        USE_DEFAULTS;
     
        private Include() {
        }
    }

    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 class CreditBorrowerRepaymentRequestDto{
    }

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

    public class ClientObjectSerialize extends JsonSerializer<CreditBorrowerRepaymentRequestDto>{
     
        @Override
        public void serialize(CreditBorrowerRepaymentRequestDto dto, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, 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)
    private String name;
     
    @JsonSerialize(using = ClientDtaeSerialize.class)
    private Date date;
    public class ClientStringSerialize extends JsonSerializer<String> {
     
        @Override
        public void serialize(String string, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
     
            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) throws IOException {
            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的时候才会执行自定义字段上的序列化注解实现类

  • 相关阅读:
    android studio无线真机调试------Android
    新建文件夹和文件,并向文件中写入数据---------Android
    wpf获取鼠标的位置-------WPF
    React Native环境搭建
    页面定制CSS代码
    视图优化
    内存优化
    电量优化
    轻量容器、枚举的使用
    AndroidAnnotations框架
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/11917384.html
Copyright © 2011-2022 走看看