引言
项目使用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)));
}
}
}