转:https://www.pianshen.com/article/950119559/

 

1.返回对象参数为null时,该参数选择显示或者不显示

  在返回参数给前端的时候,有些参数的值为null的时候,我们可以设置需要显示或者不需要显示

 

1.1设置返回为null的参数

  在配置文件中加入配置

spring.jackson.default-property-inclusion: always

 

1.2设置不返回为null的参数

  在配置文件中加入配置

spring.jackson.default-property-inclusion: non_null

 

2.返回参数为null时,转换为空字符串或者空数组

  在返回数据时,前端不想要null值,需要我们把字符串、数字类型的null转换为空字符串,把集合类型的null转换为[]

 

2.1创建类MyNullArrayJsonSerializer

  该类会将字段类型为集合类型的null值处理成空集合

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
 
import java.io.IOException;
 
/**
 * 处理数组类型的null值
 */
public class MyNullArrayJsonSerializer extends JsonSerializer {
 
    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        if (value == null) {
            jgen.writeStartArray();
            jgen.writeEndArray();
        }
    }
}

 

2.2 创建类MyNullJsonSerializer

  该类会将字段类型为字符串、int等类型的null值处理成空字符串

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
 
import java.io.IOException;
 
/**
 * 处理字符串等类型的null值
 */
public class MyNullJsonSerializer extends JsonSerializer{
 
    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException, JsonProcessingException {
        jsonGenerator.writeString("");
    }
}

 

2.3创建类MyBeanSerializerModifier

  该类控制将null值处理成空集合还是空字符串

package com.answer.waka.framework.platform.configuration;
 
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
 
import java.util.List;
import java.util.Set;
 
public class MyBeanSerializerModifier extends BeanSerializerModifier {
 
    //  数组类型
    private JsonSerializer _nullArrayJsonSerializer = new MyNullArrayJsonSerializer();
    // 字符串等类型
    private JsonSerializer _nullJsonSerializer = new MyNullJsonSerializer();
 
    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
                                                     List beanProperties) {
        //循环所有的beanPropertyWriter
        for (int i = 0; i < beanProperties.size(); i++) {
            BeanPropertyWriter writer = (BeanPropertyWriter) beanProperties.get(i);
            //判断字段的类型,如果是array,list,set则注册nullSerializer
            if (isArrayType(writer)) {
                //给writer注册一个自己的nullSerializer
                writer.assignNullSerializer(this._nullArrayJsonSerializer);
            } else {
                writer.assignNullSerializer(this._nullJsonSerializer);
            }
        }
        return beanProperties;
    }
 
    //判断是什么类型
    protected boolean isArrayType(BeanPropertyWriter writer) {
        Class clazz = writer.getPropertyType();
        return clazz.isArray() || clazz.equals(List.class) || clazz.equals(Set.class);
    }
 
}

 

2.4配置类

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 
/**
 * 处理返回值中的null值
 */
@Configuration
public class JsonConfig {
 
    @Bean
    public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {
 
        final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
 
        ObjectMapper mapper = converter.getObjectMapper();
 
        // 为mapper注册一个带有SerializerModifier的Factory,此modifier主要做的事情为:当序列化类型为array,list、set时,当值为空时,序列化成[]
        mapper.setSerializerFactory(mapper.getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier()));
 
        return converter;
    }
 
}

 

这样子处理后发现一个问题,Map格式数据返回,里面的日期全部成为了时间戳