通过选择性评估将JSON字符串转换为对象

时间:2009-07-13 20:26:06

标签: javascript json

我有一个字符串:

"{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;
 }

4 个答案:

答案 0 :(得分:3)

将其用引号括起来制作一个字符串:

{
    0: "16970861903381446063",
    length: 1
}

我假设你只是在文档中的某个地方使用它;或者您打算将其用作实际数字?

答案 1 :(得分:3)

你正在运行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}';

答案 2 :(得分:2)

听起来你需要在整个过程中保持一个字符串。但是,如果你这样做,你打算怎么做数学计算?

答案 3 :(得分:0)

好莱坞找到了一个简单的解决方案,感谢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;
    }

eval存在问题,即使我使用带字符串文字的数组,它们也是数字,而eval需要一些字符串,这些字符串不能被eval()编辑。

以下是在向字符串

显式添加引号后的示例输出
{0:'16970861903381446063',1:'16970861903381444012',length:2}