美文网首页js css html
Jackson处理前端数字精度丢失问题

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

作者: h2coder | 来源:发表于2023-02-07 20:18 被阅读0次

前言

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

解决办法

解决办法,分为

  • 局部处理,在实体类的Long类型字段上,添加注解,适合实体类中个别字段,需要转换的场景

  • 全局处理,配置一个Jackson的消息转换器,让我们在Controller层,返回实体对象时,在SpringMVC将实体类转换为Json字符串之前,将所有Long类型的字段数据,都转为String字符串类型。适合所有实体类的Long类型都转换的场景

局部处理

  • 定义一个Long类型转String类型的序列化器,泛型为源类型,例如这里是Long
/**
 * 自定义,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());
    }
}
  • 在要返回的实体类上,添加@JsonSerialize注解
public class ApArticle implements Serializable {
    //将Long转换为String,解决前端接收高精度数字,会丢失精度的问题(注意:这个注解是局部转换)
    @JsonSerialize(using = Long2StringSerializer.class)
    private Long id;
}

全局处理

  • 定义一个对象映射器,继承于ObjectMapper,添加序列化器和反序列化器,将Long类型,转为String类型
/**
 * 对象映射器:基于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配置类,添加上面的对象映射器
/**
 * 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);
    }
}

相关文章

网友评论

    本文标题:Jackson处理前端数字精度丢失问题

    本文链接:https://www.haomeiwen.com/subject/rtefkdtx.html