JSON.parse 数值类型精度丢失

简介: JSON.parse 数值类型精度丢失

问题

工作中发生这样一个问题,后台返回的json数据到前端经过序列号化后,数值类型数据精度丢失了
客户端,即浏览器上的只要是数值类型,超过15位之后就会出现精度丢失问题

解决
经多方沟通,后台不方便改,那就只能是前端自己找办法了,害

一开始处理方式是前端对字符串通过正则匹配,超过15位的数值转成字符串,但后面发现会有其它情况下也会匹配上,导致最后替换的数据不是一个正常的JSON数据

谷歌找到有个插件库,哈哈,早就有人给出了比较好的方案

方式一

import {
    parse, stringify } from 'lossless-json';

const text = '{"decimal":2.370,"long":9123372036854000123,"big":2.3e+500}';
console.log(JSON.stringify(JSON.parse(text)))
// {"decimal":2.37,"long":9123372036854000000,"big":null}
console.log(stringify(parse(text)))
// {"decimal":2.370,"long":9123372036854000123,"big":2.3e+500}

方式二
对深层次的数据,上面的方式好像有些问题。

// 对number值进行转换,如果不用这个方法,Number类型就变成LosslessNumber
function reviver(key, value) {
   
  if (value && value.isLosslessNumber) {
   
    if (Number.isSafeInteger(parseInt(value.value))) {
   
      return parseInt(value.value)
    }
    return value.value
  } else {
   
    return value
  }
}

const text = '{"decimal":2.370,"long":9123372036854000123,"big":2.3e+500}';
const LosslessJSON = require('lossless-json');
console.log(LosslessJSON.parse(text, reviver));
// {decimal: 2, long: '9123372036854000123', big: 2}

这样就可以解决了

相关文章
|
存储 JSON 算法
Json字段选取器介绍和实现
我这个工具采用很简单的语法来标识目标json的层级结构,以及每一层中你想要的字段。语法类似yaml的层级结果,用相同的缩减标识同一层,每一层的关键词是你想要的字段key,不区分大小写,为了更方便使用,也支持正则表达式。 当然这里有几个特殊规则
105 0
Json字段选取器介绍和实现
|
4月前
|
JSON 数据格式 Python
6-1|Python如何将json转化为字符串写到文件内 还保留json格式
6-1|Python如何将json转化为字符串写到文件内 还保留json格式
|
8月前
|
SQL JSON 关系型数据库
【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
137 0
|
安全 JavaScript
json-bigin大数值问题详解
json-bigin大数值问题详解
910 0
|
JSON 数据格式
Gson转换json数据为HashMap时long类型变为double问题解决
今天再使用Gson处理json数据的时候碰到了一个问题 , 当我使用如下代码解析json数据的时候 , requestTime就变为了double类型
346 0
|
Python
一日一技:字符串format忽略缺失的字段
一日一技:字符串format忽略缺失的字段
98 0
|
Java
Java:String.format格式化浮点数保留指定小数位输出字符串
Java:String.format格式化浮点数保留指定小数位输出字符串
310 0
json.Unmarshal() 反序列化字节流到 interface{} 对象,字段 int/int64 类型出现精度丢失
json.Unmarshal() 反序列化字节流到 interface{} 对象,字段 int/int64 类型出现精度丢失
|
JSON Java 数据格式
JSON学习(一):JavaBean、List类型及Map类型与Json类型的相互转化
JSON学习(一):JavaBean、List类型及Map类型与Json类型的相互转化
267 0
|
JSON 前端开发 数据格式
.net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值
在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, string whereClause) { string str=""; return Json(str); }   此时如果str过长,就会报“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值”。
2956 0

热门文章

最新文章