什么是最低有效的JSON?
我仔细阅读了JSON描述http://json.org/,但我不知道我知道简单问题的答案。 什么string是最低可能有效的JSON?
-
"string"
是string有效的JSON? -
42
是简单的数字有效的JSON? -
true
是一个有效的JSON的布尔值? -
{}
是一个有效的JSON空对象? -
[]
是空数组有效的JSON?
在撰写本文时,JSON仅在RFC4627中描述。 它描述了(在“2”开头)一个JSON文本是一个序列化的对象或数组。
这意味着只有 {}
和[]
是有效的,在符合该标准的parsing器和string中完整的JSONstring。
然而 ,ECMA-404的引入改变了这一点,更新的build议可以在这里阅读 。 我还写了一个关于这个问题的博客文章 。
然而,为了进一步混淆这个问题,Web浏览器中可用的JSON
对象(例如JSON.parse()
和JSON.stringify()
) 在ES5中是标准化的 ,并明确地定义了可接受的JSON文本,如下所示:
本规范中使用的JSON交换格式与RFC 4627中描述的完全相同,但有两个例外:
ECMAScript JSON语法的顶级JSONText生成可以由任何JSONValue组成,而不是被RFC 4627指定的JSONObject或JSONArray所限制。
剪断
这意味着所有的 JSON值(包括string,空值和数字)都被JSON对象所接受,尽pipeJSON对象在技术上符合RFC 4627。
请注意,您可以通过JSON.stringify(5)
在符合的浏览器中对数字进行string化,这将被另一个遵从RFC4627的parsing器拒绝,但不具有上面列出的特定的例外。 例如,Ruby 似乎只是一个只接受对象和数组作为根的例子 。 另一方面,PHP 特别增加了 “它也会对标量types和NULL进行编码和解码” 的exception 。
至less有四个文件(rfc-7159被认为是rfc-7158的延续),在互联网上可以被认为是JSON标准。 前三个RFC都描述了MIMEtypesapplication/json
。 以下是每个关于顶层值的说明:
RFC-4627 : 否
JSON文本是一个令牌序列。 这组记号包括六个结构字符,string,数字和三个文字名称。
JSON文本是一个序列化的对象或数组。
JSON文本=对象/数组
请注意,RFC-4627被标记为“信息性”而不是“提议的标准”,并且被RFC-7158和RFC-7159所取代。
RFC-7158 : 是的。 (截至2008年修订版 )
(请参阅RFC-7159,它现在是相同的。)
RFC-7159 : 是的。
JSON文本是一个序列化的值。 请注意,某些以前的JSON规范将JSON文本约束为对象或数组。 只生成对象或数组的JSON文本被调用的实现将是可互操作的,因为所有实现都将接受这些JSON文本。
JSON文本= ws值ws
请注意,RFC-7159的存在仅仅是因为RFC-7158的发布date在2014年3月更新( 源 )时被错误地发布为“2013年3月”。
ECMA-262 : 是的。
JSON语法语法根据由JSON词法语法定义的标记定义有效的JSON文本。 语法的目标符号是JSONText。
语法JSONText:
JSONValue
JSON值:
JSONNullLiteral
JSONBooleanLiteral
的JSONObject
JSONArray
JSONString
JSONNumber
ECMA-404 : 是的。
JSON文本是由符合JSON值语法的Unicode代码点形成的一系列令牌。 这组令牌包括六个结构性标记,string,数字和三个文字名称标记。
根据RFC 4627 (RFC 7159在2014年3月废弃)中的旧定义,这些都是有效的“JSON值”,但只有最后两个才能构成完整的“JSON文本”:
JSON文本是一个序列化的对象或数组。
根据所使用的parsing器,无论如何可能接受唯一的“JSON值”。 例如(坚持“JSON值”与“JSON文本”术语):
- 目前在现代浏览器中标准化的
JSON.parse()
函数接受任何“JSON值” - 在5.2.0版本中引入了PHP函数
json_decode
,只接受一个完整的“JSON文本”,但被修改为接受版本5.2.1中的任何“JSON值” - Python的
json.loads
根据本手册页上的json.loads
接受任何“JSON值” - http://jsonlint.com的validation器需要一个完整的“JSON文本”;
- Ruby JSON模块将只接受完整的“JSON文本”(至less根据本手册页上的注释)
区别有点像“XML文档”和“XML片段”之间的区别,尽pipe技术上<foo />
是格式良好的XML文档(最好写成<?xml version="1.0" ?><foo />
,但正如在注释中指出的那样, <?xml
声明在技术上是可选的)。
ecma规范可能对引用有用:
http://www.ecma-international.org/ecma-262/5.1/
parsing函数parsingJSON文本(JSON格式的string)并生成一个ECMAScript值。 JSON格式是ECMAScript文字的限制forms。 JSON对象被实现为ECMAScript对象。 JSON数组被实现为ECMAScript数组。 JSONstring,数字,布尔值和null实现为ECMAScriptstring,数字,布尔值和null。 JSON使用比WhiteSpace更有限的一组空白字符,并允许Unicode代码点U + 2028和U + 2029直接出现在JSONString文本中,而不使用转义序列。 由于JSON语法的限制,parsing过程类似于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值文字。
但是,官方RFC 4627指出:
JSON文本是一个序列化的对象或数组。
所以整个“文件”应该包含一个对象或数组作为最外层的结构,这当然可以是空的。 然而,许多JSONparsing器也接受原始值以及input。
JSON代表JavaScript Object Notation。 只有{}
和[]
定义一个Javascript对象。 其他的例子是价值文字。 Javascript中有对象types来处理这些值,但是expression式"string"
是一个字面值的源代码表示,而不是一个对象。
请记住,JSON不是Javascript。 这是表示数据的符号。 它有一个非常简单和有限的结构。 JSON数据使用{},:[]
字符结构化。 您只能在该结构中使用文字值。
服务器用对象描述或文字值进行响应是完全有效的。 所有的JSONparsing器应该只处理一个文字值,但只能处理一个值。 JSON一次只能表示一个对象。 因此,对于一个服务器返回多个值,它将不得不把它作为一个对象或数组。
var x; JSON.stringify(x); // will output "{}"
所以你的答案是"{}"
,它表示一个空的对象。
只需按照json.org页面上提供的铁路图表。 []和{}是可能的最小有效JSON对象。 所以答案是[]和{}。
- 解决scheme“validation失败的一个或多个实体。 有关更多详细信息,请参阅“EntityValidationErrors”属性。
- 与所有主要供应商实施单点login的最佳方法?
- 一些黑客可以从用户那里窃取cookie,并在网站上用这个名字login?
- 电子邮件地址可以有撇号吗?
- Djangoauthentication和Ajax – 需要login的URL
- 在Ruby on Rails中validation的最佳解决scheme
- 当inputvalidation失败时,Angularjs阻止表单提交
- 如何使用包含XSD的Java来validationXML文件?
- 良好的inputvalidation循环使用cin – C ++