【问题标题】:Why does JSON.parse fail with the empty string? [duplicate]为什么 JSON.parse 会因空字符串而失败? [复制]
【发布时间】:2015-08-17 18:19:58
【问题描述】:

为什么会这样:

JSON.parse('');

产生错误?

Uncaught SyntaxError: Unexpected end of input

如果只是返回null,不是更符合逻辑吗?

编辑:这不是链接问题的重复。虽然最小有效 json 的主题与这个问题有关,但它并没有解决“为什么”。

【问题讨论】:

  • 是的,这似乎是parse 函数设计中的一个错误。你可以把它包装在try catch... 但这很丑:)
  • 当传入任何无效的 JSON(如空字符串)时会产生错误。实际上,创建一个包含在 try/catch 中以避免此类错误的别名并不少见。
  • 空字符串不是有效的 json,然后失败。不要认为它不利于更多分析:)
  • 请在此处阅读 JSON 定义 en.wikipedia.org/wiki/JSON 您可以在任何 JSON Validator 中检查 JSON,例如 jsonlint.com 如果您需要空 JSON,则必须使用 {}
  • 一个空字符串,正如许多人所提到的,不是一个有效的 JSON 字符串。坦率地说,我认为这是规范的一个缺点,因为返回 null 是微不足道的。要求用户检查空字符串或 null,或将 JSON.parse 包装在 try … catch 内应该是不必要的。必须提出这个问题的事实也表明它不直观。在任何情况下,您都可以使用:JSON.parse(data||'{}') 将空字符串强制转换为安全的内容。

标签: javascript json


【解决方案1】:

由于空字符串不是有效的 JSON,JSON.parse('') 返回 null 是不正确的,因为 "null" 是有效的 JSON。例如

JSON.parse("null");

返回null。无效的 JSON 也被解析为 null 是错误的。

虽然空字符串不是有效的 JSON,但两个引号是有效的 JSON。这是一个重要的区别。

也就是说一个包含两个引号的字符串和一个空字符串不是一回事。

JSON.parse('""');

将正确解析,(返回一个空字符串)。但是

JSON.parse('');

不会。

有效的最小 JSON 字符串是

空对象'{}'

空数组'[]'

空字符串'""'

一个数字,例如'123.4'

布尔值真'true'

布尔值 false 'false'

空值'null'

【讨论】:

  • JSON.parse('""') 不起作用我收到错误:JSON::ParserError: 757: unexpected token at '""'
  • 我刚刚在 Chrome 控制台中运行了JSON.parse('""');,它按预期工作。
  • @abhillman 这是因为所有有效的 JSON 都必须是字符串,而 null 不是字符串。
  • @StephenR 我想这取决于您使用的规范。由 Douglas Crockford 发起的规范在这里json.org,它允许在这个答案中列出的原语。
  • @bhspencer pshaw。你会相信谁,我还是互联网上某个随机发明标准的人? ;-)
【解决方案2】:

使用 try-catch 来避免它:

var result = null;
try {
  // if jQuery
  result = $.parseJSON(JSONstring);
  // if plain js
  result = JSON.parse(JSONstring);
}
catch(e) {
  // forget about it :)
}

【讨论】:

    【解决方案3】:

    JSON.parse 需要字符串中的有效符号,无论是对象{}、数组[]、字符串"" 还是数字类型(int、float、doubles)。

    如果解析的内容可能是空字符串,则开发人员应检查它。

    如果将其内置到函数中,则会增加额外的循环,因为预计内置函数的性能非常好,所以不要为竞态情况编写它们是有意义的。

    【讨论】:

    • 这是不正确的。尝试解析包含两个引号的字符串 JSON.parse('""');
    • Json 不是标记语言,更准确的说法是 JSON.parse 期望符合规范的字符串。
    • JSON 不支持 int 原始类型。它被称为“数字”,不仅支持整数,而且支持实数值。
    • JSON.parse 也接受数字,即JSON.parse(123.45) -> 123.45,至少在 Firefox 中
    【解决方案4】:

    因为 '' 不是有效的 Javascript/JSON 对象。空对象将是“{}”

    供参考:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

    【讨论】:

      【解决方案5】:

      对于有效的 JSON 字符串,至少需要一个“{}”。在http://json.org/查看更多信息

      【讨论】:

      • 这是不正确的。仅包含两个引号的字符串是有效的 JSON。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多