从后台返回的数据如下:

{"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;

 

posted on 2021-08-05 17:15  周文豪  阅读(2245)  评论(0编辑  收藏  举报