最低有效JSON是多少?

2020/10/22 17:01 · javascript ·  · 0评论

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

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

在撰写本文时,RFC4627中仅描述了JSON它(在“ 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对象在技术上遵循RFC 4627,JSON对象也可以接受所有JSON值(包括字符串,空值和数字)。

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

互联网上至少有四个文档可以视为JSON标准。所引用的RFC都描述了mime类型application/json关于顶层值,以及顶层是否允许对象或数组以外的其他内容,每个人都必须说:

RFC-4627

JSON文本是令牌序列。令牌集包括六个结构字符,字符串,数字和三个文字名称。

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

JSON文本=对象/数组

请注意,RFC-4627被标记为“信息性”,而不是“提议的标准”,并且RFC-7159已将其废弃,而RFC-8259又将其废弃。

RFC-8259是。

JSON文本是令牌序列。令牌集包括六个结构字符,字符串,数字和三个文字名称。

JSON文本是序列化的值。请注意,以前的某些JSON规范将JSON文本限制为对象或数组。从所有实现都将它们接受为符合JSON文本的意义上说,仅生成需要调用JSON文本的对象或数组的实现将可以互操作。

JSON文本= ws值ws

RFC-8259的日期为2017年12月,并标记为“ INTERNET STANDARD”。

ECMA-262是的。

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

语法JSONText:

JSONValue

JSONValue:

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值”
  • json.loads根据本手册页上的示例 Python接受任何“ JSON值”
  • http://jsonlint.com上的验证程序需要完整的“ JSON文本”
  • Ruby JSON模块将仅接受完整的“ JSON文本”(至少根据本手册页上的评论

区别有点像“ XML文档”和“ XML片段”之间的区别,尽管从技术上讲<foo />是格式良好的XML文档(最好写成<?xml version="1.0" ?><foo />,但正如注释中指出的那样,<?xml声明在技术上是可选的)。

ecma规范可能对参考有用:

http://www.ecma-international.org/ecma-262/5.1/

parse函数解析JSON文本(JSON格式的String)并产生ECMAScript值。JSON格式是ECMAScript文字的受限制形式。JSON对象被实现为ECMAScript对象。JSON数组被实现为ECMAScript数组。JSON字符串,数字,布尔值和null被实现为ECMAScript字符串,数字,布尔值和null。与WhiteSpace相比,JSON使用更多的空白字符集,并且允许Unicode代码点U + 2028和U + 2029直接出现在JSONString文字中,而无需使用转义序列。解析过程类似于JSON语法所约束的11.1.4和11.1.5。

JSON.parse("string"); // SyntaxError: Unexpected token s
JSON.parse(43); // 43
JSON.parse("43"); // 43
JSON.parse(true); // true
JSON.parse("true"); // true
JSON.parse(false);
JSON.parse("false");
JSON.parse("trueee"); // SyntaxError: Unexpected token e
JSON.parse("{}"); // {}
JSON.parse("[]"); // []

JSON代表JavaScript对象符号。只有{}[]定义JavaScript对象。其他示例是值文字。Javascript中有一些对象类型可以使用这些值,但是表达式"string"是文字值的源代码表示形式,而不是对象。

请记住,JSON不是Javascript。它是表示数据的符号。它具有非常简单和有限的结构。JSON数据使用{},:[]字符进行结构化您只能在该结构内使用文字值。

服务器使用对象描述或文字值进行响应是完全有效的。所有JSON解析器都应处理仅处理一个文字值,但仅处理一个值。JSON一次只能代表一个对象。因此,要使服务器返回多个值,就必须将其构造为对象或数组。

是的,是的,是的,是的,是的。它们都是有效的JSON值文字。

但是,正式的RFC 4627指出:

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

因此,整个“文件”应由作为最外层结构的对象或数组组成,当然可以为空。但是,许多JSON解析器也接受原始值作为输入。

var x;
JSON.stringify(x); // will output "{}"

因此,您的答案是"{}"表示一个空对象。

只需遵循json.org页面上给出的铁路图即可[]和{}是最小的有效JSON对象。答案是[]和{}。

本文地址:http://javascript.askforanswer.com/zuidiyouxiaojsonshiduoshao.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!