案例:后端接口放回一个Long数据
@GetMapping("/testForLong")public Map<String, Object> testForLong() {Map<String, Object> map = new HashMap<>();map.put("aaa", 1234567890123456789L);return map;}
实际前端接收的数据
前后端数据不一致。这是因为JavaScript中的数字一律采用IEEE-754标准的64位浮点数表示,这种格式可以很好地处理大多数数字运算,但对于非常大的整数(超出2^53 - 1),就可能出现精度损失,这就非常的恶心了,可能会让你感到莫名其妙。当从后端获取到Long类型的值并尝试在前端展示时,如果该值超过了JavaScript安全整数范围,那么显示的结果可能不准确。
如何解决:
全局解决方案:项目中所有的Long都会被转换为String进行输出。
@Component
public class PackMapperCustomizer implements Jackson2ObjectMapperBuilderCustomizer {@Overridepublic void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);}
}
某个字段单独处理:
@Data
public class TestVo {@JsonSerialize(using = ToStringSerializer.class)private Long id;private String name;private Long code;
}