当前位置: 代码迷 >> 综合 >> com.alibaba.fastjson处理datetime为null的数据的解决办法
  详细解决方案

com.alibaba.fastjson处理datetime为null的数据的解决办法

热度:73   发布时间:2024-01-17 06:27:16.0

情景:使用fastjson返回数据时,时间为空时返回null,并没有出现想要的空串,前端读取数据有些问题,查看FastjsonConverter类发现没有对时间类型没有进行空值过滤处理,在网上找了一些发现记录解决此问题很少,解决后特在此记录一下,供需要的产考一下.

未解决之前代码如下:

package com.seeker.config;import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ValueFilter;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;/*** 添加fastjson的转换*/
@Configuration
public class FastjsonConverter {final static String _DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";@Beanpublic HttpMessageConverters customConverters() {// 定义一个转换消息的对象FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();// 添加fastjson的配置信息 比如 :是否要格式化返回的json数据FastJsonConfig fastJsonConfig = new FastJsonConfig();// 这里就是核心代码了,WriteMapNullValue把空的值的key也返回fastJsonConfig.setSerializerFeatures(//保留map空的字段SerializerFeature.WriteMapNullValue,// 将String类型的NULL转化为""SerializerFeature.WriteNullStringAsEmpty,// 将Number类型的NULL转化为0SerializerFeature.WriteNullNumberAsZero,// 将List类型的NULL转成[]SerializerFeature.WriteNullListAsEmpty,// 将Boolean类型的NULL转化为falseSerializerFeature.WriteNullBooleanAsFalse,// 避免循环引用SerializerFeature.DisableCircularReferenceDetect);fastJsonConfig.setDateFormat(_DATE_FORMAT);List<MediaType> fastMediaTypes = new ArrayList<MediaType>();// 处理中文乱码问题fastJsonConfig.setCharset(Charset.forName("UTF-8"));fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);fastConverter.setSupportedMediaTypes(fastMediaTypes);// 在转换器中添加配置信息fastConverter.setFastJsonConfig(fastJsonConfig);StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();stringConverter.setDefaultCharset(Charset.forName("UTF-8"));stringConverter.setSupportedMediaTypes(fastMediaTypes);// 将转换器添加到converters中return new HttpMessageConverters(stringConverter, fastConverter);}
}

解决最后代码:

package com.seeker.config;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ValueFilter;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;/*** 添加fastjson的转换*/
@Configuration
public class FastjsonConverter {final static String _DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";@Beanpublic HttpMessageConverters customConverters() {// 定义一个转换消息的对象FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();// 添加fastjson的配置信息 比如 :是否要格式化返回的json数据FastJsonConfig fastJsonConfig = new FastJsonConfig();// 这里就是核心代码了,WriteMapNullValue把空的值的key也返回fastJsonConfig.setSerializerFeatures(//保留map空的字段SerializerFeature.WriteMapNullValue,// 将String类型的NULL转化为""SerializerFeature.WriteNullStringAsEmpty,// 将Number类型的NULL转化为0SerializerFeature.WriteNullNumberAsZero,// 将List类型的NULL转成[]SerializerFeature.WriteNullListAsEmpty,// 将Boolean类型的NULL转化为falseSerializerFeature.WriteNullBooleanAsFalse,// 避免循环引用SerializerFeature.DisableCircularReferenceDetect);//如果时间类型值为null,则返回空串ValueFilter dateFilter = (Object var1, String var2, Object var3) -> {try {if (var3 == null && var1 != null && Date.class.isAssignableFrom(var1.getClass().getDeclaredField(var2).getType())) {return "";}} catch (Exception e) {}return var3;};fastJsonConfig.setSerializeFilters(dateFilter);fastJsonConfig.setDateFormat(_DATE_FORMAT);List<MediaType> fastMediaTypes = new ArrayList<MediaType>();// 处理中文乱码问题fastJsonConfig.setCharset(Charset.forName("UTF-8"));fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);fastConverter.setSupportedMediaTypes(fastMediaTypes);// 在转换器中添加配置信息fastConverter.setFastJsonConfig(fastJsonConfig);StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();stringConverter.setDefaultCharset(Charset.forName("UTF-8"));stringConverter.setSupportedMediaTypes(fastMediaTypes);// 将转换器添加到converters中return new HttpMessageConverters(stringConverter, fastConverter);}
}

最后总结:处理时间类型返回空串是下面段代码

        //如果时间类型值为null,则返回空串ValueFilter dateFilter = (Object var1, String var2, Object var3) -> {try {if (var3 == null && var1 != null && Date.class.isAssignableFrom(var1.getClass().getDeclaredField(var2).getType())) {return "";}} catch (Exception e) {}return var3;};fastJsonConfig.setSerializeFilters(dateFilter);

ok 就到这里啦

 

  相关解决方案