Javascript - 在默认解析之前将 EXTRA LARGE 数字转换为 JSON 中的字符串

Posted

技术标签:

【中文标题】Javascript - 在默认解析之前将 EXTRA LARGE 数字转换为 JSON 中的字符串【英文标题】:Javascript - convert an EXTRA LARGE Number to string in JSON before the default parsing 【发布时间】:2019-04-01 00:25:57 【问题描述】:

正如我在THIS QUESTION 中提到的,我在从服务器获取响应时遇到问题。

我收到一组具有这些属性的对象:

[
"Id": 143187001116603,   // VERY big number which I want to convert it to string
"Name": "تملی612",   // string
"Title": "تسهیلات مسکن بانک ملی-اسفند96",   // string
"InsCode": "IRO6MELZ96C1"   // string
,
...
]

JSON 文件中将指定类型(Number)转换为string 的任何简单方法?

我在JSON.stringify() 中看到了replacer 参数,但我不知道如何使用它...

更新

其中一个 ID 是:9481703061634967,但 JS 将其转换为 9481703061634968

更新

正如 Jonas H 在 this answer 中所说,JS 运行 默认解析,这就是为什么我失去了我真正的 Id 价值!

有什么想法吗?

【问题讨论】:

JSON.parse(response) ? 【参考方案1】:

您可以在 JSON.stringify() 中使用替换器,例如:

var obj  = 
"Id": 143187001116603,   // VERY big number which I want to convert it to string
"Name": "تملی612",   // string
"Title": "تسهیلات مسکن بانک ملی-اسفند96",   // string
"InsCode": "IRO6MELZ96C1"   // string
;


function replacer(name, val) 
    // convert Number to string
    if ( val && val.constructor === Number ) 
        return val.toString();
     else 
        return val; // return as is
    
;

 JSON.stringify(obj, replacer, 4);

//结果


    "Id": "143187001116603",
    "Name": "تملی612",
    "Title": "تسهیلات مسکن بانک ملی-اسفند96",
    "InsCode": "IRO6MELZ96C1"

【讨论】:

Id 的值之前更改过...请参阅更新 @MohamadKh75 这是因为 javascript 的数量限制。 我知道,这就是为什么我要求将其转换为 string JavaScript 数字是双精度浮点数;可以精确存储的最大整数是 2^53 (9007199254740992)。如果你真的需要它,你有一些有趣的数学在你面前,或者你可以使用一个库,比如big.js 我真的不需要Number 格式的那个!我只想在默认解析之前将其保存为string【参考方案2】:

假设您以 Json 字符串形式接收数据,其中包含数字,则无法使用 JSON.parse 保存数据。即使您使用第二个参数添加一个转换函数,它也只会在默认解析已经解析出大量数字时丢失信息的数字后运行。您需要使用例如直接操作字符串以将数字括在引号中。一个正则表达式。

你也可以使用 json-bigint npm 包:https://www.npmjs.com/package/json-bigint

【讨论】:

感谢您提供信息 - 请您提供一些代码吗?在默认解析之前有什么方法可以做到这一点? 试试我刚刚添加的链接,这可能比自己滚动更好。 谢谢 - 我可以将它与 Axios 一起使用吗?或者我必须使用fetch() 并将响应保存在JSONbig 我不确定是否可以在自动 Json 解析步骤之前使用 axios 拦截器或 responseTransform,但您可能想尝试一下。 它正在工作! transformResponse 在自动 JSON 解析之前运行!【参考方案3】:

function replacer(key, value) 
  // Filtering out properties
  if (key === 'Id') 
    return value.toString();
  
  return value;


const t = [
    "Id": 143187001116603, // VERY big number which I want to convert it to string
    "Name": "تملی612", // string
    "Title": "تسهیلات مسکن بانک ملی-اسفند96", // string
    "InsCode": "IRO6MELZ96C1" // string
  ,
  
    "Id": 9481703061634967, // VERY big number which I want to convert it to string
    "Name": "تملی232", // string
    "Title": "تسهیلات مسکن بانک ملی-اسفن216", // string
    "InsCode": "IRO6MSDZ96C1" // string
  
]
const stringifiedValue = JSON.stringify(t, replacer)
console.log(JSON.parse(stringifiedValue))

使用 JSON.stringify 的替换回调试试这个。

欢迎反馈。

【讨论】:

【参考方案4】:

将响应转换为string,然后用正则表达式替换以将Id字段转换为字符串类型:

const axios = require('axios');

axios.get(url,  transformResponse: [data => data] ).then(response => 
  let parsed = JSON.parse(response.data.replace(/"Id":(\d+),/g, '"Id":"$1",'));
  console.log(parsed);
);

【讨论】:

以上是关于Javascript - 在默认解析之前将 EXTRA LARGE 数字转换为 JSON 中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

javascript预解析

Javascript小白经典题型解析

[转]Ext ComboBox 默认选中某一项

以芯片直读方式得到的全盘镜像解析及ext4日志区域解析

javaScript之this全面解析

RecordField 中的默认值在执行时引发 JavaScript 错误