栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot的自带序列化jackson的使用 对不同类型的null字段进行设置指定值

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot的自带序列化jackson的使用 对不同类型的null字段进行设置指定值

JackSon是解析JSON和XML的一个框架,优点是简单易用,性能较高。

SpringBoot使用Jackson序列化时将null转成空字符串

简介
大家知道很多情况下,我们的API中数据交换都用JSON数据,这种数据格式简单、易读写、且轻量。在SpringBoot中默认使用jackson帮助我们进行序列化与反序列化的操作。

在控制层将我们的对象序列化返回给前端时,有些字段为null,序列化后的值也是null,如果前端直接展示的话,对用户不够友好,这里我们可以对jackson稍加修改,将值为null的转换成空字符串""。

不要使用继承MappingJackson2HttpMessageConverter的方式进行编写,可能会导致无法访问swgger文档的情况,但是接口是可以正常调用的

使用以下方式

可以根据不同类型的null转换成指定的值

package com.fish.config.jackson;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;


public class CustomizeNullJsonSerializer {

    
    public static class NullArrayJsonSerializer extends JsonSerializer {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, 
        					  SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeStartArray();
            jsonGenerator.writeEndArray();
        }
    }

    
    public static class NullStringJsonSerializer extends JsonSerializer {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, 
        					  SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeString("");
        }
    }

    
    public static class NullNumberJsonSerializer extends JsonSerializer {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, 
                              SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeNumber(0);
        }
    }

    
    public static class NullBooleanJsonSerializer extends JsonSerializer {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, 
                              SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeBoolean(false);
        }
    }

    
    public static class NullObjectJsonSerializer extends JsonSerializer {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, 
                              SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeStartObject();
            jsonGenerator.writeEndObject();
        }
    }

}
 
package com.fish.config.jackson;

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;


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 (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);
    }

    
    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);
    }

    
    private boolean isBooleanType(BeanPropertyWriter writer) {
        Class clazz = writer.getType().getRawClass();
        return clazz.equals(Boolean.class);
    }

}
package com.fish.config.jackson;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;


@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        
        objectMapper.setSerializerFactory(objectMapper.getSerializerFactory()
                .withSerializerModifier(new MyBeanSerializerModifier()));

        SerializerProvider serializerProvider = objectMapper.getSerializerProvider();
        //serializerProvider.setNullValueSerializer(new CustomizeNullJsonSerializer.NullObjectJsonSerializer());
        return objectMapper;
    }
}

格式化date类型可以在properties或者yml中进行配置

全局统一

#date类型时间格式化
#pring.jackson.date-format=yyyy-MM-dd HH:mm:ss
#spring.jackson.joda-date-time-format=yyyy-MM-dd HH:mm:ss
#spring.jackson.time-zone=GMT+8
#date类型转换时间戳
spring.jackson.serialization.write-dates-as-timestamps=true

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号