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是邪恶的。