Javascript 使用选择性求值将JSON字符串转换为对象
我有一个字符串:Javascript 使用选择性求值将JSON字符串转换为对象,javascript,json,Javascript,Json,我有一个字符串: "{0:16970861903381446063,length:1}" { 0: "16970861903381446063", length: 1 } 我尝试使用eval方法将其转换为一个对象,但它也会计算字符串并因此对数值进行舍入,返回: {0:16970861903381447000,length:1} 在调用eval之前,我尝试将该号码作为字符串传递, 创建JSON字符串时使用16970861903381446063+'作为值;用typeof检查它
"{0:16970861903381446063,length:1}"
{
0: "16970861903381446063",
length: 1
}
我尝试使用eval
方法将其转换为一个对象,但它也会计算字符串并因此对数值进行舍入,返回:
{0:16970861903381447000,length:1}
在调用eval
之前,我尝试将该号码作为字符串传递,
创建JSON字符串时使用16970861903381446063+'
作为值;用typeof
检查它会显示为string
类型,但它仍然将数字16970861903381446063四舍五入为16970861903381447000
有没有一种方法可以绕过这个问题,或者有更好的方法
下面是从包含数字的数组生成json文本的代码
function simplify(arr){
request = "{";
if (arr.length ==1){
request += 0 + ":" + (arr[0] + '') + "," ;
}
else{
for (var i=0;i<=arr.length-1 ;i++){
request += i + ":" + (arr[i] + '') + ",";
}
}
request += "length" + ":" + arr.length +"}";
return request;
}
功能简化(arr){
请求“{”;
如果(arr.length==1){
请求+=0+“:”+(arr[0]+''>)+“,”;
}
否则{
for(var i=0;i听起来你需要在整个过程中保持它是一个字符串。但是,如果你这样做了,你打算如何用它做任何数学运算?只需将它用引号括起来就可以形成一个字符串:
"{0:16970861903381446063,length:1}"
{
0: "16970861903381446063",
length: 1
}
我假设您只是在文档中的某个地方使用它;或者您打算将其作为实际数字使用?好吧,感谢freenode的同事,找到了一个简单的解决方案
function simplify(arr){
request = "{";
if (arr.length ==1){
request += ( 0 + ":" + "'" + String(arr[0])+ "'" + ",") ;
}
else{
for (var i=0;i<=arr.length-1 ;i++){
request += i + ":" + "'" + String(arr[i]) + "'" + ",";
}
}
request += "length" + ":" + arr.length +"}" ;
return request;
}
你遇到的是IEEE双精度浮点的精度,它使用53位作为尾数,11位作为指数
Javascript数字全部由64位浮点数表示。许多语言中的浮点数由尾数和指数两部分表示。在Javascript中,尾数为53位,指数为11位
例如,当您看到表示为3.5346367e+22的数字时,尾数为3.5246367,指数为22
您试图存储的数字大于尾数的最大值,因此您的数字将被舍入,较大的数字将得到指数
长话短说,除非你对这些巨大的数字进行算术运算,否则你应该将它们存储为字符串
最后,您应该将JSON数组表示为实际的JSON数组,而不是通过定义整数键和长度属性来假装为数组的对象:
// Do this
json = '["16970861903381446063"]';
// Not this
json = '{0:"16970861903381446063", length:1}';
这就是问题所在,我希望通过将其设置为字符串,然后在正在进行计算的服务器端将其转换回整数,从而绕过解析。我怀疑问题在于该数字太大,无法用作整数,而是被视为浮点。浮点的范围很大,但它们近似。让我补充一下,如果是这种情况,答案是从右边开始将数字字符串拆分,并将其存储在一组整数中。您能详细说明一下吗?可以举个小例子吗?是的,我想将其用作数字(在服务器端),但我想不出任何其他方法来绕过求值,然后转换为字符串。是的,将大数字作为字符串传递可以避免解析问题。但您是否需要在客户端对这些数字进行数学运算,或者只显示它们?此外,Triptych关于序列化格式的观点完全正确。是的,它们在服务器端进行处理,所以它是正确的现在使用它们作为字符串很好。再次感谢各位。感谢确认。FP是邪恶的。