我已经仔细阅读了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条答案
按热度按时间szqfcxe21#
在撰写本文时,JSON仅在RFC4627中描述。它将JSON文本描述为(在“2”的开头)序列化的对象或数组。
这意味着 * 只有 *
{}
和[]
是有效的,完整的JSON字符串在遵循该标准的解析器和字符串化器中。然而,为了进一步混淆问题,Web浏览器中可用的
JSON
对象(例如JSON.parse()
和JSON.stringify()
)在ES 5中是标准化的,并且明确定义了可接受的JSON文本如下:本规范中使用的JSON交换格式与RFC 4627中描述的格式完全相同,但有两个例外:
这意味着JSON对象接受 * 所有 * JSON值(包括字符串、空值和数字),即使JSON对象在技术上遵守RFC 4627。
请注意,你可以在一个兼容的浏览器中通过
JSON.stringify(5)
字符串化一个数字,这将被另一个遵循RFC 4627的解析器拒绝,但它没有上面列出的特定异常。另一方面,Ruby,例如,would seem to be one such example which only accepts objects and arrays as the root.PHP,专门添加了“它也将编码和解码标量类型和NULL”的异常。zxlwwiss2#
在互联网上至少有四个文档可以被认为是JSON标准。引用的RFC都描述了mime类型
application/json
。下面是每个文档关于顶级值的说明,以及是否允许在顶部使用对象或数组以外的任何内容:RFC-4627:否
JSON文本是一个标记序列。标记集包括六个结构化字符、字符串、数字和三个字面名称。
JSON文本是序列化的对象或数组。
JSON-text = object / array
请注意,RFC-4627被标记为“信息”而不是“建议标准”,并且它被RFC-7159淘汰,而RFC-7159又被RFC-8259淘汰。
RFC-8259:是
JSON文本是一个标记序列。标记集包括六个结构化字符、字符串、数字和三个字面名称。
JSON文本是一个序列化的值。请注意,JSON的某些先前规范将JSON文本限制为对象或数组。仅生成对象或数组的实现将是可互操作的,因为所有实现都将接受这些作为符合JSON文本。
JSON-text = ws值ws
RFC-8259于2017年12月发布,并标记为“互联网标准”。
ECMA-262:是
JSON句法语法根据JSON词法语法定义的标记定义有效的JSON文本。语法的目标符号是JSONText。
简体中文
JSONValue
JSON值:
JSONNullLiteral
JSON布尔文字
JSONObject
JSONArray
JSONString
JSON编号
ECMA-404:是
JSON文本是由符合JSON值语法的Unicode代码点形成的标记序列。标记集包括六个结构标记、字符串、数字和三个文字名称标记。
aurhwmvo3#
根据RFC 4627中的旧定义(在2014年3月被RFC 7159废弃),这些都是有效的“JSON值”,但只有最后两个才能构成完整的“JSON文本”:
JSON文本是序列化的对象或数组。
根据使用的解析器,单独的“JSON值”可能会被接受。例如(坚持“JSON值”与“JSON文本”术语):
JSON.parse()
函数接受任何“JSON值”json_decode
在5.2.0版中引入,仅接受整个“JSON文本”,但在5.2.1版中修改为接受任何“JSON值”json.loads
根据示例on this manual page接受任何“JSON值”这种区别有点像“XML文档”和“XML片段”之间的区别,尽管从技术上讲,
<foo />
是一个格式良好的XML文档(最好写成<?xml version="1.0" ?><foo />
,但正如注解中指出的那样,<?xml
声明在技术上是可选的)。k2arahey4#
JSON代表JavaScript Object Notation。只有
{}
和[]
定义了JavaScript对象。其他示例是值文字。JavaScript中有用于处理这些值的对象类型,但表达式"string"
是文字值的源代码表示,而不是对象。请记住,JSON不是JavaScript。它是一种表示数据的符号。它具有非常简单和有限的结构。JSON数据使用
{},:[]
字符进行结构化。您只能在该结构中使用文字值。对于服务器来说,使用对象描述或文字值进行响应是完全有效的。所有JSON解析器都应该处理文字值,但只能处理一个值。JSON一次只能表示一个对象。因此,如果服务器要返回多个值,则必须将其构造为对象或数组。
bfnvny8b5#
ecma规范可以作为参考:
http://www.ecma-international.org/ecma-262/5.1/
parse函数解析JSON文本(JSON格式的字符串)并生成ECMAScript值。JSON格式是ECMAScript文字的受限形式。JSON对象实现为ECMAScript对象。JSON数组实现为ECMAScript数组。JSON字符串,数字,布尔值和null实现为ECMAScript字符串,数字,布尔值,JSON使用的白色空格字符集比空白字符集更有限,并允许Unicode代码点U+2028和U+2028。2029直接出现在JSONString文本中,而不使用转义序列。解析过程类似于11.1.4和11.1.5,受JSON语法的约束。
字符串
3z6pesqy6#
是的,都是有效的JSON值文字。
官方RFC 4627声明:
JSON文本是序列化的对象或数组。
因此,一个完整的“文件”应该包含一个对象或数组作为最外层的结构,当然可以是空的。然而,许多JSON解析器也接受原始值作为输入。
ws51t4hk7#
从PHP 8.3开始,有一个新的函数叫做
json_validate()
。这个函数非常方便,因为它可以检查字符串是否包含有效的JSON。用法很简单。您只需将JSON字符串传递给
json_validate()
,它就会验证字符串是否是有效的JSON格式。如果给定的字符串在语法上是有效的JSON,则返回true,否则返回false。更多:https://www.php.net/manual/en/function.json-validate.php
vpfxa7rd8#
只要按照json.org页面上给出的铁路图。[]和{}是最小可能的有效JSON对象。因此答案是[]和{}。