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

jquery.parse json解析错误

  •  1
  • SapphireSun  · 技术社区  · 14 年前

    此代码失败,异常指示无效的JSON:

    var example = '{ "AKEY": undefined }';
    jQuery.parseJSON(example);
    

    我可以用空字符串替换所有未定义的内容来修复它。未定义文件不是JSON的一部分吗?

    4 回复  |  直到 14 年前
        1
  •  4
  •   josh3736    14 年前

    如果你能把你的头绕在这个上面, 令牌 undefined 实际上是未定义的。

    请允许我详细说明:尽管javascript有一个称为undefined的特殊原语值, 未定义 一个javascript关键字也没有任何特殊的含义。您可以将测试对象存在性的代码与 未定义 通过定义它。

    var obj = { BKEY: 'I exist!' };
    if (obj.AKEY == undefined) console.log ('no AKEY');
    if (obj.BKEY == undefined) console.log ('should not happen');
    
    undefined='uh oh';
    
    if (obj.AKEY == undefined) console.log ('oops!'); // Logically, we want this to execute, but it will not!
    if (obj.BKEY == undefined) console.log ('should not happen');
    

    唯一的控制台输出将是'no akey'。在我们给全局变量赋值之后 未定义 , obj.AKEY == undefined 变得错误是因为 undefined != 'uh oh' . obj.BKEY == undefined 仍然返回错误,但只是因为我们很幸运。如果我已经准备好了 obj.BKEY='uh oh' 然后 obj.bkey==未定义 会是 , 即使它确实存在 !

    你可能想解释一下 AKEY null . (顺便说一下, 无效的 关键字; null='uh oh' 引发异常)。

    你也可以简单地忽略 阿基 从您的JSON,在这种情况下,您会发现:

    typeof(example.AKEY) == 'undefined'
    

    (如果您设置 阿基 无效的 然后 typeof(example.AKEY) == 'object' )

    设置为空和省略之间唯一的区别是是否希望键出现在foreach循环中。

        2
  •  4
  •   Matthew Flaschen    14 年前

    不,但是 null 是。RFC 4627 §2.1 :

    JSON值必须是一个对象、数组, 数字、字符串或 以下三个文字名称:

      false null true
    
    var example = '{ "AKEY": null }';
    
        3
  •  1
  •   Jeff the Bear    14 年前

    对的。未定义和函数不在JSON中表示。 http://www.json.org/js.html

        4
  •  1
  •   Nick Craver    14 年前

    JSON中不允许使用它们……看看替代方案,很清楚为什么:

    var example = '{}';
    var obj = jQuery.parseJSON(example);
    obj.AKEY //undefined
    

    如果是的话 undefined ,当您访问它时,它与密钥相同,甚至不存在。因为JSON的主要目的是传输数据(否则更广泛的对象文字语法就可以了)…最好把它完全排除在外。