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;
  • 相关阅读:
    linux安装nginx
    python-- python threadpool 的前世今生
    如何用 Go 实现热重启
    使用expect快速登录线上机器
    curl 使用手册
    date命令时间戳和时间之间的转换
    linux设置程序运行超时时间
    你见过的最全面的python重点
    golang学习之旅:使用go语言操作mysql数据库
    Python多进程编程
  • 原文地址:https://www.cnblogs.com/zwh0910/p/15104277.html
Copyright © 2011-2022 走看看