【问题标题】:Is this simple string considered valid JSON?这个简单的字符串是否被认为是有效的 JSON?
【发布时间】:2011-11-21 05:15:40
【问题描述】:

我在 SO 中看到了很多复杂的问题,是否认为某些复杂的结构是有效的 JSON。

但是光谱的另一端呢?

"12345"

上面的 JSON 是有效的吗?

【问题讨论】:

标签: javascript json


【解决方案1】:

是的,在大多数情况下。它是表示 JSON 值的有效 JSON 语法。

对此的混淆来自于 Douglas Crockford 的 RFC 4627,它最初在 2006 年定义了 application/json 互联网媒体类型。它说:

JSON 文本是一个序列化的对象或数组。

但是,正如 Crockford 在 2013 年的一篇文章中解释的那样(不幸的是,Google+ 的其余部分已删除,但 archived here):

JSON 只是一个语法,语法包括数字和字符串。 JSON 的使用必须更加严格。 RFC-4627 是一种可能的用途,它从未打算成为 JSON 本身的标准。

示例字符串是一个有效的 JSON 值,但将其用作 application/json HTTP 响应的完整“JSON 文本”正文是不正确的。然而,这已不再正确:RFC-4627 在 2014 年随着 RFC 7159 的发布而被淘汰,它允许您使用任何 JSON 值:

JSON 文本是一个序列化值。请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或数组。

“JSON 本身的标准”也在 2013 年发布,名称为 ECMA-404,并且 JSON 也在 ECMAScript (JavaScript) 规范 ECMA-262 的 5.1 版中定义。这些规范和大多数解析器允许任何 JSON 值作为完整的 JSON 文本,即使它只是一个简单的字符串。

【讨论】:

    【解决方案2】:

    它是一个有效的 JSON 字符串,但它不是一个 JSON 对象。

    http://www.json.org/

    【讨论】:

      【解决方案3】:

      在编写此问题时,这不是有效的 JSON 文本。它应该是一个有效的字符串,可以作为 JSON 文本的一部分出现。

      original specification 说:

      JSON 文本是一个序列化的对象或数组。

      ...意味着顶层必须是{}[]。你不能用绳子直接潜入。

      latest specification 说:

      JSON 文本是一个序列化值。请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或数组。

      所以现在任何值(包括字符串)都可以是完整的 JSON 文本,"12345" 现在有效。

      【讨论】:

        【解决方案4】:

        截至 2014 年,RFC 7159 淘汰了旧的 JSON RFC,并声明 任何 JSON 值是有效的 JSON 文本和有效的应用程序/json 内容 - 包括字符串。但是,它也指出了与旧 JSON 实现的不兼容问题:

        请注意,某些先前的 JSON 规范限制了 JSON 文本作为对象或数组。实现 仅生成需要 JSON 文本的对象或数组 从某种意义上说,所有实现都将是可互操作的 接受这些作为符合标准的 JSON 文本。

        【讨论】:

          【解决方案5】:

          您可以简单地检查 JSON.parse 可以处理的内容:

          https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#examples

          这都是有效的 JSON:

          JSON.parse('{}');              // {}
          JSON.parse('true');            // true
          JSON.parse('"foo"');           // "foo"
          JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
          JSON.parse('null');            // null
          

          【讨论】:

            猜你喜欢
            • 2012-10-30
            • 1970-01-01
            • 2013-02-13
            • 1970-01-01
            • 2010-11-14
            • 2022-01-19
            • 1970-01-01
            • 2018-04-07
            相关资源
            最近更新 更多