【问题标题】:JSON Parse Error Using jQuery.parseJSON使用 jQuery.parseJSON 的 JSON 解析错误
【发布时间】:2011-05-12 16:14:05
【问题描述】:

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

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

我能够通过用空字符串替换所有未定义来修复它。未定义不是 JSON 的一部分吗?

【问题讨论】:

    标签: javascript jquery json


    【解决方案1】:

    如果你能理解这一点,token undefined 实际上是未定义的。

    请允许我详细说明:尽管 JavaScript 有一个特殊的原始值,称为 undefined,undefined 不是 JavaScript 关键字,也没有任何特殊含义。您可以通过定义 undefined 来破坏测试对象是否存在的代码。

    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');
    

    唯一的控制台输出将是“无 AKEY”。在我们分配给全局变量 undefined 之后,obj.AKEY == undefined 变为 false,因为 <i>undefined</i> != 'uh oh'obj.BKEY == undefined 仍然返回 false,但这只是因为我们很幸运。如果我设置了obj.BKEY='uh oh',那么obj.BKEY == undefined 将是true即使它确实存在

    您可能希望将AKEY 显式设置为null。 (顺便说一下,null 关键字;null='uh oh' 抛出异常)。

    您也可以简单地从您的 JSON 中省略 AKEY,在这种情况下您会发现:

    typeof(example.AKEY) == 'undefined'
    

    (如果您将AKEY 设置为null,则typeof(example.AKEY) == 'object'。)

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

    【讨论】:

      【解决方案2】:

      不,但null 是。 RFC 4627 §2.1:

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

        false null true
      
      var example = '{ "AKEY": null }';
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          它们在 JSON 中是不允许的...看看替代方案,原因就很清楚了:

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

          如果是undefined,当你去访问它时,它甚至与密钥不存在相同。由于 JSON 的主要目的是传输数据(否则更广泛的对象字面量语法就可以了)……最好完全不使用它。

          【讨论】:

          • {}{AKEY: undefined} 之间有 区别。对于后者,AKEY 将出现在 for each 枚举中。
          • @Matthew - 但是,当您访问它时,没有区别......您能想出一个有效的用例,您希望看到它被枚举和关心,因为它没有定义?
          • 没有。并且它绝对简化了 JSON 的事情,只是为了让 null。我只是想指出存在差异。
          猜你喜欢
          • 1970-01-01
          • 2011-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-22
          相关资源
          最近更新 更多