解决Long返回前端精度丢失

方式一:属性序列化注解@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
}

配置了@JsonSerializeidage被转换成了文本

  • 优点

    灵活,针对对象的属性配置,想转那个就转那个,不会干扰到其他属性或者对象

  • 缺点

    每个需要转换的属性都需要配置,有点苦力活的意思

方式二:全局配置,将数值类型转换为文本

如果需要将所有的数值类型全部转换成文本,可以在application.yml中添加如下配置:

spring:
  jackson:
    generator:
      write_numbers_as_strings: true #序列化的时候,将数值类型全部转换成字符串返回

测试示例:

{
  "id": "1508733541883731970",
  "name": "zhangsan",
  "age": "10",
  "gender": "1"
}
  • 优点:

    配置完,所有的数值类型全部转换为文本,一劳永逸;

  • 缺点

    上面的优点,也是缺点的一部分,过于笼统,不够灵活;

方式三,单类型转换

可以自定义一个Jackson对象转换构造器,将指定类型以特定的序列化方式进行转换,比如遇到LongDouble的时候,才转换为文本

@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转换成了文本;IntegerShort类型的并未受到影响;

以上三种方式都有各自适用的场景,相比而言,第一种和第三种用的相对普遍一点,可以根据自己的实际情况酌情选择;

方式四,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);
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值