添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

内容管理(八)01-删除-数字最大安全值 -axios默认转换格式JSON.parse() 改为 json-bigint格式JSONbig.parse(json) 处理json对象中的id值

最新推荐文章于 2023-07-20 12:09:30 发布
最新推荐文章于 2023-07-20 12:09:30 发布

现象:后端给的值太大了,前端处理不了;获取到的数据值是不安全的

按F12检查——>点击Network 并刷新且看后端传给的数据,

​ 点击左侧数据,①看右侧Response,显示数据格式为 json文本 不能直接用,需要转化为json对象;

​ ②看右侧Preview中 json对象

  • “id”: 1166528593157685248 在response中 json文本

  • id: 1166528593157685200 在preview中 json对象 (JSON.parse()转换)

  • 在项目中是 axios 默认使用JSON.parse()转换,

    同一id值转化过程中发生变化,不能直接使用

  • 现象原因:后台返回的数字的值 超出了js数字的最大安全值

    • 最大值为:2的53次方 (Number.MAX_SAFE_INTEGER 获取)

    • JSON.parse() 有误差

    • 数值运算 有误差

  • 处理问题:转换的时候改成其他的格式

    • 使用 json-bigint 的js插件

      使用方法: axios中json-bigint处理json数据最大值无法准确获取
      网址:https://www.npmjs.com/package/json-bigint

    • 安装 npm i json-bigint

    • 导包 api/index.js var JSONbig = require('json-bigint')

    • 使用: JSONbig.parse(json)

    • 覆盖axios的转换方式,使用上面的方式。

    transformResponse: [function (data) {
        // 对 data 进行任意转换处理
        return data;
    }],
    

    最终代码:api/index.js

    import JSONBIG from 'json-bigint'
    // 默认配置  转换响应数据
    axios.defaults.transformResponse = [data => {
      // 对data(后台的原始数据)进行转换
      return JSONBIG.parse(data)
                        内容管理(八)01-删除-数字最大安全值 -axios默认转换格式JSON.parse()  改为  json-bigint格式JSONbig.parse(json)   处理json对象中的id值
                        10-内容管理-删除-数字最大安全值现象:后端给的值太大了,前端处理不了;获取到的数据值是不安全的按F12检查——>点击Network 并刷新且看后端传给的数据,​      点击左侧数据,①看右侧Response,显示数据格式为 json文本  不能直接用,需要转化为json对象;​                                 ②看右侧Preview中 json...
    				
    首先,后端返回的数据一般是JSON格式的字符串, 而axios 会默认自动把后端返回的JSON格式的字符串使用JSON.parse()转换为JS对象,但是由于JS的安全整数范围为 因此,如果后端返回的数据有超过这个范围的数字(如用户的ID),则这种默认转换方式将会出错,转换过来的数据将会不准确。 此时的解决方案: 采用第三方包json-bigint,这个包parse方法将可以解决这个问题。 使用parse()方法后,json-bigint 会把超出 JS 安全整数范围的数字转为一个 Big
    json 用于大型 POJO 的基于流的 JSON.parseJSON.stringify 实现 对于大型数据集,存在许多基于流的 JSON 解析或字符串化实现。 这些实现典型的目标时间序列数据、换行符分隔的数据或其他类似数组的数据,例如日志记录或其他连续流动的数据。 该模块希望填补生态系统的一个空白:解析真正大对象的大型 JSON 对象。 对于大型内存对象,可能会遇到 V8 字符串长度限制,目前(截至 2017 年 9 月)限制为 512MB。 因此,如果您的大对象具有足够的键或,则在调用时可能会超出字符串长度限制。 类似地,当从磁盘或通过网络检索存储的 JSON 时,如果对象JSON 字符串化表示超过字符串长度限制,则该过程将在尝试将 Buffer 转换为字符串时抛出。 处理此类大对象的唯一方法是使用JSON.parseJSON.stringify的流实现。
    它会吧超出JS安全证书范围的数字转换为一种类型为BigNumber的对象 使用时需要把这个BigNumber.toString()就能得到原来正确的数据了 JSONBig.parse(str).id.toString()
    内容管理(八)02-删除-响应无内容处理- JSONBIG.parse(null) 报错-代码最好使用try{}catch(){},弹出框确认消息组件使用
    bigints的解析/stringify。基于Douglas Crockford的JSON.js包和bignumber.js库。 本地Bigint最近被添加到JS,所以我们增加了一个选项来代替bignumber.js。但是,使用本机BigInt进行解析是为了向后兼容。bigints 虽然大多数JSON解析器假设数具有与IEEE 754 double相同的精度限制,但JSON规范对数字精度没有任何规定。任何十进制(可选科学)表示法的浮点数都是有效的JSON。在JSON api,将可能不符合IEEE
    import JSONbig from 'json-bigint' //可以通过axios的transformResponse方法,这个方法的作用是在传递给then/catch前,允许修改响应数据 //axios在这里默认把响应体从json字符串转.
    今天遇到一个js因为数字过大而导致数据传输时精度丢失,导致疯狂报错的问题(无奈),检查了好几遍代码后确定并没有写错代码,然后又回来找原因,这也好像是我第一次遇到大数字传输的问题。。。我的需求就只是通过一个很长的id,然后发起请求并从后端获取相应的数据,最后发现是id过长导致的报错,下面是我对这个问题的一些思考和理解 JavaScript可以很精准的来表示-2^53到2^53之间的数(不包含端点),ES6提供了两个方法Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_I
    axios的transformResponse 后端回传的真实id是19位的数,超过了js能表达的最大安全整数,所以要引入一个额外的包JSONBig处理这个问题。 在src/utils/request.js(就是封装axios的工具文件) import JSONBig from 'json-bigint' // 导入JSONBig const instance = axios.create(
    想必,很多人都遇到过关于后端返回数据的大数字问题。明明你写的代码没有问题,然后后台的接口也没问题,但是你调用接口返回的数据就有误。 JavaScript 能够准确表示的整数范围在-2^53到 2^53之间(不含两个端点),超过这个范围,无法精确表示这个,这使得 JavaScript 不适合进行科学和金融方面的精确计算。 先举个例子 Math.pow(2, 53) // 9007199254740992 9007199254740992 // 9007199254740992 900719925474
    js最大数和java是不一样的,最好的方法肯定是后端自始至终就以字符串的格式传递。但是也有以数字传递的情况如果后端不改,就需要前端去做,这里使用到的是 json-bigint 插件 npm i json-bigint 目前前端请求基本都是axios,我这里就是用的axios,在谷歌network可以看到后端返回的正确数字,但是前端展示时就有了问题,这个插件json-bigint,可以在axios返回的时候就帮忙去做处理,如果没有超出js最大数,不做任何处理。如果超出,会以数组的形式返回,我们只需要遍历数
    首先采用数据库mysql id字段类型为bigint; 问题场景:使用IdWork.uuid();获取随机20位长整型数字;在vue页面进行根据id查询时,数据查不到;因为id和原纪录id不对应;最后几位全部是0; 之前采取的是后台java程序将返回的vo实体id修改string类型;可以得到解决; 近期又遇到该问题,难道不能再前端解决吗?于是在一篇文档查看了一个引入插件jsonbigint解决的方式,试了一下果然可以; 本人是在若依(ruoyi.vip)平台基础上做的调整,这里把原有的自增i.
    JavaScript 能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围,无法精确表示这个,这使得 JavaScript 不适合进行科学和金融方面的精确计算。 Math.pow(2, 53) // 9007199254740992 9007199254740992 // 9007199254740992 9007199254740993 // 9007199254740992 Math.pow(2, 53) === Math.pow(2, 53) + 1 // true
    axios.post 是使用 axios 库发送 POST 请求的方法,它可以向服务器发送数据。而 json.stringify 是将一个 JavaScript 对象序列化成一个 JSON 字符串的方法,用于将数据转换为字符串格式,方便在网络上传输或存储到数据库。在 axios.post 方法,通常将需要发送的数据对象通过 json.stringify 转换为字符串后,作为请求的 body 参数传递给后端服务器。例如: ```javascript import axios from 'axios'; const data = { name: 'John', age: 30 axios.post('/api/user', JSON.stringify(data)) .then(response => { console.log(response.data); .catch(error => { console.error(error); 在上面的例子,我们向 /api/user 接口发送了一个 POST 请求,并将包含 name 和 age 的 data 对象通过 JSON.stringify 转换为字符串后,作为请求的 body 参数发送给服务器。服务器可以通过解析请求的 body 参数来获取我们发送的数据。
    图形化开发(六)01-Three.js之导入模型——3dmax和SketchUp-editor编辑器导出json文件,在创建模型initMesh中外部的JSON文件 那只猫喝咖啡: 为啥我下面没有这个json文件显示 vue中使用图像编辑器tui-image-editor(一) viceen: 没有 跨域和接口有关系 vue中使用图像编辑器tui-image-editor(一) kaifangiou: 有碰到跨域的问题么 vue3中,封装el-select选择器组件(二)——filterable模糊搜索、watch用法、nextTick用法、toRefs用法、sessionStorage取值、设置基准地址apiUrl vue3中,封装el-select选择器组件(一)——表单四等分布局、查询、重置resetFields、el-date-picker起止日期、特殊字符校验、自定义指令v-throttle用于按钮防抖 vue3封装表单组件(三)02封装el-dialog组件的传值-select选择框、input输入框之查询、重置的使用 & vue3中父子传值的使用步骤