我仔细阅读了JSON描述http://json.org/但我不确定我知道这个简单问题的答案 . 哪些字符串是最小可能的有效JSON?
-
"string"
是字符串有效的JSON? -
42
是简单的有效JSON号码? -
true
是一个有效JSON的布尔值? -
{}
是空对象的有效JSON吗? -
[]
是空数组的有效JSON吗?
我仔细阅读了JSON描述http://json.org/但我不确定我知道这个简单问题的答案 . 哪些字符串是最小可能的有效JSON?
"string"
是字符串有效的JSON?
42
是简单的有效JSON号码?
true
是一个有效JSON的布尔值?
{}
是空对象的有效JSON吗?
[]
是空数组的有效JSON吗?
8 回答
在撰写本文时,JSON仅在RFC4627中描述 . 它将JSON文本(在"2"的开头)描述为序列化对象或数组 .
这意味着只有
{}
和[]
是符合该标准的解析器和字符串中的有效完整JSON字符串 .但是,ECMA-404的引入改变了,并且更新了建议can be read here . 关于这个问题,我也是written a blog post .
然而,为了进一步混淆此事,Web浏览器中可用的
JSON
对象(例如JSON.parse()
和JSON.stringify()
)是standardised in ES5,并且明确定义了可接受的JSON文本,如下所示:这意味着JSON对象接受所有JSON值(包括字符串,空值和数字),即使JSON对象在技术上遵守RFC 4627 .
请注意,您可以通过
JSON.stringify(5)
在符合标准的浏览器中对数字进行字符串化,这将被另一个遵循RFC4627但没有上面列出的特定异常的解析器拒绝 . 例如,Ruby,would seem to be one such example which only accepts objects and arrays as the root . 另一方面,PHP,specifically adds the exception,"it will also encode and decode scalar types and NULL" .互联网上至少有四个可以被视为JSON标准的文件 . 所引用的RFC都描述了mime类型
application/json
. 以下是每个人对顶级值的看法,以及顶部是否允许除对象或数组以外的任何内容:RFC-4627 : No.
请注意,RFC-4627标记为"informational"而不是"proposed standard",并且它被RFC-7159淘汰,而后者又被RFC-8259淘汰 .
RFC-8259 : Yes.
RFC-8259的日期为2017年12月,标有“INTERNET STANDARD” .
ECMA-262 : Yes.
ECMA-404 : Yes.
根据RFC 4627中的旧定义(已于2014年3月由RFC 7159废弃),这些都是有效的"JSON values",但只有最后两个将构成一个完整的"JSON text":
根据所使用的解析器,无论如何都可能接受单独的“JSON值” . 例如(坚持“JSON值”与“JSON文本”术语):
现在在现代浏览器中标准化的JSON.parse()函数接受任何"JSON value"
PHP函数json_decode在5.2.0版本中引入,仅接受整个"JSON text",但在版本5.2.1中被修改为接受任何"JSON value"
Python的
json.loads
根据示例on this manual page接受任何"JSON value"http://jsonlint.com的验证人要求完整"JSON text"
Ruby JSON模块只接受完整"JSON text"(至少根据评论on this manual page)
区别有点像"XML document"和"XML fragment"之间的区别,虽然技术上
<foo />
是一个格式良好的XML文档(最好写成<?xml version="1.0" ?><foo />
,但正如评论中指出的那样,<?xml
声明在技术上是可选的) .JSON代表JavaScript Object Notation . 只有
{}
和[]
定义了一个Javascript对象 . 其他例子是 Value 文字 . Javascript中有对象类型用于处理这些值,但表达式"string"
是文字值的源代码表示,而不是对象 .请记住,JSON不是Javascript . 它是表示数据的表示法 . 它有一个非常简单和有限的结构 . JSON数据使用
{},:[]
字符构造 . 您只能在该结构中使用文字值 .对于服务器来说,使用对象描述或文字值进行响应是完全有效的 . 应该处理所有JSON解析器以仅处理文字值,但只处理一个值 . JSON一次只能表示一个对象 . 因此,对于服务器返回多个值,必须将其构造为对象或数组 .
是的,是的,是的,是的,是的 . 所有这些都是有效的JSON值文字 .
然而,官方RFC 4627指出:
所以整个“文件”应该由一个对象或数组组成,作为最外层的结构,当然可以是空的 . 然而,许多JSON解析器也接受原始值以及输入 .
ecma规范可能对参考有用:
http://www.ecma-international.org/ecma-262/5.1/
所以你的答案是
"{}"
,表示一个空对象 .只需按照json.org页面上给出的铁路图表进行操作即可 . []和{}是可能的最小有效JSON对象 . 所以答案是[]和{} .