js css html

Jackson处理前端数字精度丢失问题

2023-02-07  本文已影响0人  h2coder

前言

在返回Long类型数据给前端时,出现后三位数字精度丢失问题。例如Long类型的Id,导致前端回传Id到后端时,后三位数字都丢失为0,导致查询不到对应Id的数据

解决办法

解决办法,分为

局部处理

/**
 * 自定义,Long转换String的序列化器类
 * 泛型:源类型
 */
public class Long2StringSerializer extends JsonSerializer<Long> {
    @Override
    public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        //将值转换为String,并写出
        jsonGenerator.writeString(value.toString());
    }
}
public class ApArticle implements Serializable {
    //将Long转换为String,解决前端接收高精度数字,会丢失精度的问题(注意:这个注解是局部转换)
    @JsonSerialize(using = Long2StringSerializer.class)
    private Long id;
}

全局处理

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {
    public JacksonObjectMapper() {
        super();
        //注册序列化器,将Long类型,转为String类型
        SimpleModule simpleModule = new SimpleModule()
                .addSerializer(Long.class, ToStringSerializer.instance);
        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}
/**
 * SpringMVC配置
 */
@Configuration
public class ServiceMvcConfig implements WebMvcConfigurer {
    /**
     * 扩展mvc框架的消息转换器
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //创建消息转换器对象
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        //设置对象转换器,底层使用Jackson将Java对象转为json
        messageConverter.setObjectMapper(new JacksonObjectMapper());
        //将上面的消息转换器对象追加到mvc框架的转换器集合中
        converters.add(0, messageConverter);
    }
}
上一篇下一篇

猜你喜欢

热点阅读