zoukankan      html  css  js  c++  java
  • 为什么从后台获取的id到前端后却变了?Long类型转json时前端js丢失精度解决方案-----@JsonSerialize和@JsonDeserialize

    从后台返回的数据如下:

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

    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;
  • 相关阅读:
    客户端用java api 远程操作HDFS以及远程提交MR任务(源码和异常处理)
    HighCharts终极版本
    Highcharts网页版
    情感化设计中的手绘应用表现
    前端批量下载文件
    PHP 大文件下载,文件传输,支持断点续传。 2g以上超大文件也有效
    PHP超大文件下载,断点续传下载
    php下载大文件,支持断点续传案例
    解决PHP超大文件下载,断点续传下载的方法详解
    PHP如何异步断点续传大文件
  • 原文地址:https://www.cnblogs.com/zwh0910/p/15104277.html
Copyright © 2011-2022 走看看