下面提几个解决办法:
1.注解方式
/**
* 主键
*/
//@JSONField(serializeUsing= ToStringSerializer.class)
//@JsonFormat(shape = JsonFormat.Shape.STRING)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
2.自定义ObjectMapper
在启动类或者新建一个配置类亦可
@SpringBootApplication
@EnableTransactionManagement
public class Application {
/**
* 解决Jackson导致Long型数据精度丢失问题
* @return
*/
@Bean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, ToStringSerializer.instance);
module.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(module);
return objectMapper;
}
public static void main(String[] args){
SpringApplication.run(Application.class,args);
}
}
@JsonComponent
public class JsonSerializerManage {
@Bean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
//忽略value为null 时 key的输出
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
/**
* 序列换成json时,将所有的long变成string
* 因为js中得数字类型不能包含所有的java long值
*/
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, ToStringSerializer.instance);
module.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(module);
return objectMapper;
}
}
3.配置参数
在yml或者properties增加配置
jackson:
generator:
write_numbers_as_strings: true
该方式会强制将所有数字全部转成字符串输出,这种方式的优点是使用方便,不需要调整代码;缺点是颗粒度太大,所有的数字都被转成字符串输出了,包括按照timestamp格式输出的时间也是如此。不推荐。
4.自定义全局转换器
springboot2以下的版本写个配置类实现WebMvcConfigurerAdapter重写configureMessageConverters方法。
springboot2及其以上的版本写个配置类实现WebMvcConfigurer重写configureMessageConverters方法(2以上版本WebMvcConfigurerAdapter已经废弃了,不推荐使用)。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 解决主键Long类型返回给页面时,页面精度丢失的问题,时间格式化返回
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//格式化json数据格式
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);
fastJsonConfig.setDateFormat("yyyy-HH-dd HH:mm:ss");
fastConverter.setFastJsonConfig(fastJsonConfig);
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastMediaTypes.add(MediaType.APPLICATION_JSON);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
converters.add(0,fastConverter);
}
}