fastJson配置的(FastJsonConfiguration)的作用 null装换成““ 或者是不返回null值

第一种解决办法

  • 实际开发过程中,当我们返回json数据时,如果数据为空,那么默认返回null(因为ResponseBody这个注解底层就是使用的jackson)。毕竟程序员不喜欢null这个字眼。
    那么我们如何不让他返回null呢?我们可以使用fastJson解决。fastJson是阿里巴巴的开源库,被誉为史上最快的Json解析库

首先请看查询结果
在这里插入图片描述
因为数据库中enName的值为空,所以查询出的结果就表示为Null。
那么我们如何不返回null,而返回一个" "空的字符串呢?其实很
简单,只需要增加fastjson配置替换默认的jackson配置即可。 下面贴出代码。

/**
 * @Description FastJson配置类
 */
@Configuration
public class FastJsonConfiguration implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        /*
31
         先把JackSon的消息转换器删除.
32
         备注: (1)源码分析可知,返回json的过程为:
33
                    Controller调用结束后返回一个数据对象,for循环遍历conventers,找到支持application/json的HttpMessageConverter,然后将返回的数据序列化成json。
34
                    具体参考org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor的writeWithMessageConverters方法
35
               (2)由于是list结构,我们添加的fastjson在最后。因此必须要将jackson的转换器删除,不然会先匹配上jackson,导致没使用fastjson
36
        */

        for (int i = converters.size() - 1; i >= 0; i--) {
            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
                converters.remove(i);
            }
        }
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                // 防止循环引用
                SerializerFeature.DisableCircularReferenceDetect,
                // 空集合返回[],不返回null
                SerializerFeature.WriteNullListAsEmpty,
                // 空字符串返回"",不返回null
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteDateUseDateFormat,
                SerializerFeature.WriteMapNullValue
        );
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);

        //处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);

        converters.add(fastJsonHttpMessageConverter);
    }
}

接下类我们再次运行。会发现
在这里插入图片描述
这样的话,enName的值就变成了了空的字符串。而生效的代码就是这一行

 // 空字符串返回"",不返回null
   SerializerFeature.WriteNullStringAsEmpty,

那么接下来同学还有疑问就是,我如果不想返回enName这个属性该怎么做呢?其实也很简单,我们只需要在该属性的实体类上增加一个注解即可。
图中标注黄色的部分
在这里插入图片描述

  @JSONField(serialize = false)

再次运行
在这里插入图片描述
这时候就会返现返回的数据没有了enName这个属性。
这是我的数据库中的数据。
在这里插入图片描述

参考博客1
参考博客2
参考博客3
参考博客4

配置fastjson不生效问题
参考博客1
参考博客2

第二种解决办法 不使用fastJson

@Configuration
public class MyFastJsonConfig{

    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }

}

第三种解决办法

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class FastJsonConfiguration extends WebMvcConfigurationSupport {
	@Override
	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
		FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
		FastJsonConfig config = new FastJsonConfig();
		config.setSerializerFeatures(
				// 保留 Map 空的字段
				SerializerFeature.WriteMapNullValue,
				// 将 String 类型的 null 转成""
				SerializerFeature.WriteNullStringAsEmpty,
				// 将 Number 类型的 null 转成 0
				SerializerFeature.WriteNullNumberAsZero,
				// 将 List 类型的 null 转成 []
				SerializerFeature.WriteNullListAsEmpty,
				// 将 Boolean 类型的 null 转成 false
				SerializerFeature.WriteNullBooleanAsFalse,
				// 避免循环引用
				SerializerFeature.DisableCircularReferenceDetect);

		converter.setFastJsonConfig(config);
		converter.setDefaultCharset(Charset.forName("UTF-8"));
		List<MediaType> mediaTypeList = new ArrayList<>();
		// 解决中文乱码问题,相当于在 Controller 上的 @RequestMapping 中加了个属性 produces = "application/json"
		mediaTypeList.add(MediaType.APPLICATION_JSON);
		converter.setSupportedMediaTypes(mediaTypeList);
		converters.add(converter);
	}

欢迎加入技术群聊
在这里插入图片描述

这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值