从后台返回的数据如下:
{"success":true,"msg":"监管网产品管理信息","data":[{"createUser":null,"updateUser":null,"createTime":null,"updateTime":null,"id":1534595659129294849,"entityId":null,"productNo":"1000046001","productName":"甲型肝炎灭活疫苗","authorizedNo":"国药准字S10900080","type":"3","spec":"250U/0.5ml/支","packUnit":"4","subtypeno":"1000046001","warrantyPeriod":null,"packageRatio":null,"isValid":null,"packageSpec":"10支/盒","imgPath":null,"standardCode":"86902481000144","drugIdCode":"876263234234","packConvRatio":"1:10"}],"obj":null,"code":1,"total":1,"page":1}
在前端打印出来就变成了:
现象:后台是Long类型时,前端只能保留17位,后两位用00补充。
原因分析:Java后端开发过程中,尤其是id字段,因数值太大,通过json形式传输到前端后,在js解析时,会丢失精度。
解决方案:后端传输到前端,将id字段转为json时,转换为字符串类型;前端传输到后端,再重新转换为Long。
项目采用的springboot框架,而springboot框架默认配置json转换工具就是jackson。如此,使用注解解决问题很nice了。
解决办法:
1、新建两个实体类
LongJsonSerializer
/** * Long 类型字段序列化时转为字符串,避免js丢失精度 */ public class LongJsonSerializer extends JsonSerializer<Long> { @Override public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { String text = (value == null ? null : String.valueOf(value)); if (text != null) { jsonGenerator.writeString(text); } } }
注意:为什么要将Long类型转为字符串?因为前端在使用getList方法查询时,要获取Long类型字段的值,如果不转换成String类型,会造成精度丢失。
LongJsonDeserializer
/** * 字符串转为Long */ @Slf4j public class LongJsonDeserializer extends JsonDeserializer<Long> { @Override public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { String value = jsonParser.getText(); try { return value == null ? null : Long.parseLong(value); } catch (NumberFormatException e) { log.error("解析长整形错误", e); return null; } } }
2、在后台实体类的主键中加以下注解
@JsonSerialize(using = LongJsonSerializer.class) @JsonDeserialize(using = LongJsonDeserializer.class) @Id @Column(name = "id") private Long id;