Spring Boot配置自定义全局fastjson

1,247 阅读1分钟

引言

项目使用fastjson将数据转为json时,对于一些字段需要特殊的转换,比如LocalDateTime需要转为特定的格式yyyy-MM-dd HH:mm:ss,默认是带有T的格式;项目中使用Long类型id长度过长会导致丢失精度,可以将其转为字符串等。

依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
</dependency>

部分代码

配置类替换自带的Jackson解析
注意:如果项目中已经有配置类继承了WebMvcConfigurationSupport会失效

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

import java.time.LocalDateTime;
import java.util.List;

/**
 * Json全局转换器
 */

@Configuration
public class LocalDateTimeSerializerConfig extends WebMvcConfigurationSupport {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
        // 清除默认json转换器
        converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);

        FastJsonHttpMessageConverter httpMessageConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance();
        // 格式化LocalDateTime日期类型,自定义格式转换
        serializeConfig.put(LocalDateTime.class, LocalDateTimeSerializer.instance);
        // Long类型转化为String,解决丢失精度问题
        serializeConfig.put(Long.class, ToStringSerializer.instance);
        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
        config.setSerializeConfig(serializeConfig);
        config.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect);
        httpMessageConverter.setFastJsonConfig(config);
        converters.add(httpMessageConverter);
    }
}

自定义格式转换器


import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.lang.reflect.Type;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 自定义LocalDateTime类型格式转换器
 */

@Component
public class LocalDateTimeSerializer implements ObjectSerializer {

    public static final LocalDateTimeSerializer instance = new LocalDateTimeSerializer();

    private static final String pattern = "yyyy-MM-dd HH:mm:ss";


    @Override
    public void write(JSONSerializer jsonSerializer, Object o, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = jsonSerializer.out;
        if (o == null) {
            out.writeNull();
        } else {
            LocalDateTime time = (LocalDateTime) o;
            out.writeString(time.format(DateTimeFormatter.ofPattern(pattern)));
        }
    }
}