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;
  • 相关阅读:
    webservice的几种调用方式
    捕获的异常到控制台的的信息转为String输出,在保存日志方面有用
    IO文件的读取与写入
    eclipse修改内存大小
    Oracle序列的创建与删除
    NFS挂载-实现文件共享
    arraylList.add(int,obj)的底层是怎么样的??
    Oracle修改表字段数据类型
    SVN版本库打包迁移备份恢复
    linux中tar详解
  • 原文地址:https://www.cnblogs.com/zwh0910/p/15104277.html
Copyright © 2011-2022 走看看