方式一:属性序列化注解@JsonSerialize
可以将对象中的指定属性以文本的方式进行序列化
@Data
class User{
@JsonSerialize(using = ToStringSerializer.class)
Long id;
String name;
@JsonSerialize(using = ToStringSerializer.class)
Integer age;
Short gender;
}
测试数据:
{
"id": "1508733541883731970",
"name": "zhangsan",
"age": "10",
"gender": 1
}
配置了@JsonSerialize
的id
和age
被转换成了文本
-
优点
灵活,针对对象的属性配置,想转那个就转那个,不会干扰到其他属性或者对象
-
缺点
每个需要转换的属性都需要配置,有点苦力活的意思
方式二:全局配置,将数值类型转换为文本
如果需要将所有的数值类型全部转换成文本,可以在application.yml中添加如下配置:
spring:
jackson:
generator:
write_numbers_as_strings: true #序列化的时候,将数值类型全部转换成字符串返回
测试示例:
{
"id": "1508733541883731970",
"name": "zhangsan",
"age": "10",
"gender": "1"
}
-
优点:
配置完,所有的数值类型全部转换为文本,一劳永逸;
-
缺点
上面的优点,也是缺点的一部分,过于笼统,不够灵活;
方式三,单类型转换
可以自定义一个Jackson对象转换构造器,将指定类型以特定的序列化方式进行转换,比如遇到Long
、Double
的时候,才转换为文本
@Bean("jackson2ObjectMapperBuilderCustomizer")
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
Jackson2ObjectMapperBuilderCustomizer customizer = new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance)
.serializerByType(Long.TYPE, ToStringSerializer.instance);
}
};
return customizer;
}
测试数据:
{
"id": "1508733541883731970",
"name": "zhangsan",
"age": 10,
"gender": 1
}
Long类型的id转换成了文本;Integer
和Short
类型的并未受到影响;
以上三种方式都有各自适用的场景,相比而言,第一种和第三种用的相对普遍一点,可以根据自己的实际情况酌情选择;
方式四,FASTJSON
package com.cj.storehouse.config;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
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.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
/**
* @program: storehouse-parent
* @description: 注册拦截器
* @author: Adorable Sir
* @create: 2022-01-25 17:20
**/
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastConvert = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
/**
* 解决精度丢失问题
*/
SerializeConfig serializeConfig = SerializeConfig.globalInstance;
serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
serializeConfig.put(Long.class, ToStringSerializer.instance);
serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
fastJsonConfig.setSerializeConfig(serializeConfig);
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON);
fastConvert.setSupportedMediaTypes(fastMediaTypes);
fastConvert.setFastJsonConfig(fastJsonConfig);
return new HttpMessageConverters((HttpMessageConverter<?>) fastConvert);
}
}