代码之家  ›  专栏  ›  技术社区  ›  Amit

使用选择性求值将JSON字符串转换为对象

  •  3
  • Amit  · 技术社区  · 17 年前

    我有一个字符串:

    "{0:16970861903381446063,length:1}"
    

    我尝试使用 eval 方法,但它也会计算字符串并因此对数值进行四舍五入,返回:

    {0:16970861903381447000,length:1}
    

    评估 在上面, 使用 16970861903381446063 + '' 作为创建JSON字符串时的值;用以下方式检查 typeof string

    以下是从包含数字的数组生成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 回复  |  直到 17 年前
        1
  •  3
  •   James    17 年前

    你遇到的是IEEE双精度浮点的精度,它使用53位作为尾数,11位作为指数。

    例如,当你看到表示为3.5346367e+22的数字时,尾数为3.5246367,指数为22。

    您尝试存储的数字大于尾数的最大值,因此您的数字会四舍五入,较大的数字会得到指数。

    长话短说,除非你正在用这些巨大的数字进行算术运算,否则你应该将它们存储为字符串。

    最后,您应该将JSON数组表示为实际的JSON数组,而不是通过定义整数键和长度属性假装为数组的对象:

    // Do this
    json = '["16970861903381446063"]';
    
    // Not this
    json = '{0:"16970861903381446063", length:1}';
    
        2
  •  3
  •   Kenan Banks    17 年前

    只需将其括在引号中即可生成字符串:

    {
        0: "16970861903381446063",
        length: 1
    }
    

    我假设你只是在文档的某个地方使用它;还是你打算把它当作一个实际的数字?

        3
  •  2
  •   Steven Sudit    17 年前

    听起来你需要一直保持一根绳子。然而,如果你这样做,你打算如何用它做数学运算?

        4
  •  0
  •   Amit    17 年前

    多亏了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;
        }
    

    以下是在字符串中显式添加引号后的示例输出

    {0:'16970861903381446063',1:'16970861903381444012',length:2}