如何在 Javascript 中处理 JSON 响应中的大整数
How to handle big integer numbers in JSON response in Javascript
我正在使用 Java脚本和 ExtJS 框架开发 Web 应用程序。
我需要找到以下问题的通用解决方案 -
在我为员工提供数据的应用程序中,我调用了服务器 api,这给了我员工数据的 json 响应 -
服务器响应:{"id":10765432100123456789,"id_str":“10765432100123456789”,"name":"Employee1"}
现在在客户端,我正在使用 ExtJS ajax 调用,它调用服务器并通过将响应文本转换为对象来给出响应。
但是当我检查对象时,我注意到 id 键的值更改为不同的数字,而 id_str 键的值保持不变。
当我试图找到根本原因时,我开始了解 javascript 数字限制(Java脚本最多支持 53 位整数)。
现在,在我完整的应用程序中,我使用 ID 密钥来引用员工 ID。现在我不想去每个地方并更改代码以引用 id_str 的 id 值。
注意 - 在我的应用程序中,Employee 是我引用的一个对象,但我已经在 id 键上为大约 20 多个对象编写了代码。
谁能指导我处理这种情况的最佳解决方案。
我正在考虑按以下方式重写 JSON.parse(ExtJS 内部使用此函数将 json 字符串转换为对象)函数 -
var oldFN = JSON.parse;
JSON.parse = function(){
var jsonStrParam = arguments[0];
//TODO Read jsonStrParam and write custom logic to convert id integer values to string values
var reviverFuncParam = null;
if(arguments.length == 2)
reviverFuncParam = arguments[1];
return oldFN(jsonStrParam,reviverFuncParam);
}
在我上面的方法中,我必须编写代码将 id 整数值转换为字符串值,然后将其交给解析函数。
我认为这会导致性能问题,因为我已经解析了字符串并对其进行了迭代,并将每个键的整数值更改为字符串值。
谁能帮我弄清楚我需要编写什么来处理 javascript 端的大整数的最佳解决方案。
是否应该在客户端(浏览器javascript)端或服务器端(Java DAO 层)处理?
我遇到了同样的问题。在我的应用程序中,ID 被传递到客户端并且仅用于引用数据(例如,我从未增加或减少它或以任何其他方式依赖它是一个 数字 )。
所以我所做的是在 JSON:
中发送修改后的 ID
{
"id" : "id#10765432100123456789",
"name" : "Employee1"
}
然后在输入端我设置了一个过滤器,如果参数值以 "id#" 开头,则去除前三个字符并将其余字符转换为 int64_t.
由于 Javascript 方的 ID 现在以 id#
开头,它始终被视为字符串。问题已解决。
如果在选择器中使用它,您可能希望使用 __id__
之类的前缀而不是 id#
:
$('#__id__10765432100123456789').css({ backgroundColor: "red" });
我正在使用 Java脚本和 ExtJS 框架开发 Web 应用程序。
我需要找到以下问题的通用解决方案 -
在我为员工提供数据的应用程序中,我调用了服务器 api,这给了我员工数据的 json 响应 -
服务器响应:{"id":10765432100123456789,"id_str":“10765432100123456789”,"name":"Employee1"}
现在在客户端,我正在使用 ExtJS ajax 调用,它调用服务器并通过将响应文本转换为对象来给出响应。
但是当我检查对象时,我注意到 id 键的值更改为不同的数字,而 id_str 键的值保持不变。
当我试图找到根本原因时,我开始了解 javascript 数字限制(Java脚本最多支持 53 位整数)。
现在,在我完整的应用程序中,我使用 ID 密钥来引用员工 ID。现在我不想去每个地方并更改代码以引用 id_str 的 id 值。
注意 - 在我的应用程序中,Employee 是我引用的一个对象,但我已经在 id 键上为大约 20 多个对象编写了代码。
谁能指导我处理这种情况的最佳解决方案。
我正在考虑按以下方式重写 JSON.parse(ExtJS 内部使用此函数将 json 字符串转换为对象)函数 -
var oldFN = JSON.parse;
JSON.parse = function(){
var jsonStrParam = arguments[0];
//TODO Read jsonStrParam and write custom logic to convert id integer values to string values
var reviverFuncParam = null;
if(arguments.length == 2)
reviverFuncParam = arguments[1];
return oldFN(jsonStrParam,reviverFuncParam);
}
在我上面的方法中,我必须编写代码将 id 整数值转换为字符串值,然后将其交给解析函数。
我认为这会导致性能问题,因为我已经解析了字符串并对其进行了迭代,并将每个键的整数值更改为字符串值。
谁能帮我弄清楚我需要编写什么来处理 javascript 端的大整数的最佳解决方案。
是否应该在客户端(浏览器javascript)端或服务器端(Java DAO 层)处理?
我遇到了同样的问题。在我的应用程序中,ID 被传递到客户端并且仅用于引用数据(例如,我从未增加或减少它或以任何其他方式依赖它是一个 数字 )。
所以我所做的是在 JSON:
中发送修改后的 ID{
"id" : "id#10765432100123456789",
"name" : "Employee1"
}
然后在输入端我设置了一个过滤器,如果参数值以 "id#" 开头,则去除前三个字符并将其余字符转换为 int64_t.
由于 Javascript 方的 ID 现在以 id#
开头,它始终被视为字符串。问题已解决。
如果在选择器中使用它,您可能希望使用 __id__
之类的前缀而不是 id#
:
$('#__id__10765432100123456789').css({ backgroundColor: "red" });