什么是最低有效的JSON?

我仔细阅读了JSON描述http://json.org/,但我不确定我是否知道简单问题的答案。 什么字符串是最低可能的有效JSON?

  • "string"是字符串有效的JSON?
  • 42是简单的数字有效的JSON?
  • true是布尔值是有效的JSON吗?
  • {}是一个有效的JSON的空对象?
  • []是空数组有效的JSON?

  • 在撰写本文时,JSON仅在RFC4627中有描述。 它描述了(在“2”开头)一个JSON文本是一个序列化的对象或数组。

    这意味着只有{}[]是有效的,在符合该标准的解析器和字符串中完整的JSON字符串。

    然而,ECMA-404的引入改变了这一点,并且可以在这里阅读更新的建议。 我也写过关于这个问题的博客文章。


    然而,为了进一步混淆这个问题,Web浏览器中提供的JSON对象(例如JSON.parse()JSON.stringify() )在ES5中是标准化的,并且清楚地定义了可接受的JSON文本,如下所示:

    本规范中使用的JSON交换格式与RFC 4627中描述的完全相同,但有两个例外:

  • ECMAScript JSON语法的顶级JSONText生成可以由任何JSONValue组成,而不是被RFC 4627指定的JSONObject或JSONArray限制。

  • 剪断

  • 这意味着所有的JSON值(包括字符串,空值和数字)都被JSON对象接受,即使JSON对象在技术上符合RFC 4627。

    请注意,因此您可以通过JSON.stringify(5)在符合浏览器中对数字进行字符串化,这将被另一个符合RFC4627的解析器拒绝,但它没有上面列出的特定例外。 例如,Ruby似乎只是一个只接受对象和数组作为根的例子。 另一方面,PHP特别增加了“它也会对标量类型和NULL进行编码和解码”的异常。


    至少有四个文件(rfc-7159被认为是rfc-7158的延续),可以被认为是互联网上的JSON标准。 前三个RFC都描述了MIME类型application/json 。 以下是每个关于顶级值的说明:

    RFC-4627No.

    JSON文本是一系列令牌。 这组令牌包括六个结构字符,字符串,数字和三个字面名称。

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

    JSON文本=对象/数组

    请注意,RFC-4627被标记为“信息性”而不是“提议的标准”,并且它被RFC-7158和RFC-7159废弃。

    RFC-7158是的。 (截至2008年修订版)

    (请参阅RFC-7159,它目前是相同的。)

    RFC-7159是的。

    JSON文本是一个序列化的值。 请注意,某些先前的JSON规范将JSON文本约束为对象或数组。 只生成对象或数组的JSON文本被调用的实现将是可互操作的,因为所有实现都将接受这些JSON文本为符合条件的JSON文本。

    JSON文本= ws值ws

    请注意,RFC-7159的存在仅仅是因为RFC-7158的发布日期在2014年3月更新(来源)时被错误地发布为“2013年3月”。

    ECMA-262是的。

    JSON语法语法根据由JSON词法语法定义的标记定义有效的JSON文本。 语法的目标符号是JSONText。

    语法JSONText:

    JSONValue

    JSON值:

    JSONNullLiteral

    JSONBooleanLiteral

    的JSONObject

    JSONArray

    JSONString

    JSONNumber

    ECMA-404是的。

    JSON文本是由符合JSON值语法的Unicode代码点形成的一系列令牌。 这组令牌包括六个结构性令牌,字符串,数字和三个文字名称令牌。


    根据RFC 4627(由RFC 7159于2014年3月废弃)中的旧定义,这些都是有效的“JSON值”,但只有最后两个才会构成完整的“JSON文本”:

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

    根据所使用的解析器,无论如何,可以接受唯一的“JSON值”。 例如(坚持“JSON值”与“JSON文本”术语):

  • 目前在现代浏览器中标准化的JSON.parse()函数接受任何“JSON值”
  • PHP函数json_decode在版本5.2.0中引入,只接受一个完整的“JSON文本”,但被修改为接受版本5.2.1中的任何“JSON值”
  • 根据本手册页上的示例,Python的json.loads接受任何“JSON值”
  • http://jsonlint.com上的验证器需要完整的“JSON文本”
  • Ruby JSON模块将只接受完整的“JSON文本”(至少根据本手册页上的注释)
  • 这种区别有点像“XML文档”和“XML片段”之间的区别,尽管技术上<foo />是格式良好的XML文档(它最好写成<?xml version="1.0" ?><foo /> ,但正如注释中指出的那样, <?xml声明在技术上是可选的)。

    链接地址: http://www.djcxy.com/p/45815.html

    上一篇: What is the minimum valid JSON?

    下一篇: What does `void 0` mean?