我正在使用Javascript& amp;开发一个Web应用程序。 ExtJS框架。
我需要找到以下问题的通用解决方案 -
在我为Employee提供数据的应用程序中,我调用了服务器api,它给了我对员工数据的json响应 -
SERVER RESPONSE:{“id”:10765432100123456789,“id_str”:“10765432100123456789”,“name”:“Employee1”}
现在在客户端我正在使用ExtJS ajax调用,它调用服务器并通过将响应文本转换为对象来提供响应。
但是当我检查对象时,我注意到id键的值被更改为不同的数字,id_str键的值保持不变。
当我试图找到根本原因时,我开始了解javascript数量限制(Javascript最多支持53位整数)。
现在在我的完整应用程序中,我使用id键来引用员工ID。现在我不想去每个地方并更改代码以引用id_str作为id值。
注意 - 在我的应用程序中,Employee是我提到的一个对象,但是我有大约20多个对象,我已经在id键上编写了代码。
有人可以指导我处理这种情况的最佳解决方案。
我正在考虑以下列方式覆盖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层)处理?
答案 0 :(得分:0)
我遇到了同样的问题。在我的应用程序中,ID被传递到客户端并且仅用于引用数据(例如,我从未增加或减少它或以任何其他方式依赖于它是数字)。
所以我做的是在JSON中发送修改后的ID:
{
"id" : "id#10765432100123456789",
"name" : "Employee1"
}
然后在输入端我设置了一个过滤器,如果参数值以“id#”开头,则删除前三个字符并将其余字符转换为int64_t。
由于Javascript端的ID现在以id#
开头,因此始终将其视为字符串。问题解决了。
如果您在选择器中使用它,则可能需要使用__id__
之类的前缀而不是id#
:
$('#__id__10765432100123456789').css({ backgroundColor: "red" });