最小有效JSON是多少?

11dmarpk  于 12个月前  发布在  其他
关注(0)|答案(8)|浏览(162)

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

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

szqfcxe21#

在撰写本文时,JSON仅在RFC4627中描述。它将JSON文本描述为(在“2”的开头)序列化的对象或数组。
这意味着 * 只有 * {}[]是有效的,完整的JSON字符串在遵循该标准的解析器和字符串化器中。

然而,为了进一步混淆问题,Web浏览器中可用的JSON对象(例如JSON.parse()JSON.stringify())在ES 5中是标准化的,并且明确定义了可接受的JSON文本如下:
本规范中使用的JSON交换格式与RFC 4627中描述的格式完全相同,但有两个例外:

  • ECMAScript JSON语法的顶级JSONText产品可以由任何JSONValue组成,而不是像RFC 4627所规定的那样被限制为JSONObject或JSONArray。
    • 被剪断 *

这意味着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”的异常。

zxlwwiss

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代码点形成的标记序列。标记集包括六个结构标记、字符串、数字和三个文字名称标记。

aurhwmvo

aurhwmvo3#

根据RFC 4627中的旧定义(在2014年3月被RFC 7159废弃),这些都是有效的“JSON值”,但只有最后两个才能构成完整的“JSON文本”:
JSON文本是序列化的对象或数组。
根据使用的解析器,单独的“JSON值”可能会被接受。例如(坚持“JSON值”与“JSON文本”术语):

  • 现在在现代浏览器中标准化的JSON.parse()函数接受任何“JSON值”
  • PHP函数json_decode在5.2.0版中引入,仅接受整个“JSON文本”,但在5.2.1版中修改为接受任何“JSON值”
  • Python的json.loads根据示例on this manual page接受任何“JSON值”
  • http://jsonlint.com上的验证器需要完整的“JSON文本”
  • Ruby JSON模块将只接受完整的“JSON文本”(至少根据注解on this manual page

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

k2arahey

k2arahey4#

JSON代表JavaScript Object Notation。只有{}[]定义了JavaScript对象。其他示例是值文字。JavaScript中有用于处理这些值的对象类型,但表达式"string"是文字值的源代码表示,而不是对象。
请记住,JSON不是JavaScript。它是一种表示数据的符号。它具有非常简单和有限的结构。JSON数据使用{},:[]字符进行结构化。您只能在该结构中使用文字值。
对于服务器来说,使用对象描述或文字值进行响应是完全有效的。所有JSON解析器都应该处理文字值,但只能处理一个值。JSON一次只能表示一个对象。因此,如果服务器要返回多个值,则必须将其构造为对象或数组。

bfnvny8b

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语法的约束。

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("[]"); // []

字符串

3z6pesqy

3z6pesqy6#

是的,都是有效的JSON值文字。
官方RFC 4627声明:
JSON文本是序列化的对象或数组。
因此,一个完整的“文件”应该包含一个对象或数组作为最外层的结构,当然可以是空的。然而,许多JSON解析器也接受原始值作为输入。

ws51t4hk

ws51t4hk7#

从PHP 8.3开始,有一个新的函数叫做json_validate()。这个函数非常方便,因为它可以检查字符串是否包含有效的JSON。
用法很简单。您只需将JSON字符串传递给json_validate(),它就会验证字符串是否是有效的JSON格式。如果给定的字符串在语法上是有效的JSON,则返回true,否则返回false。
更多:https://www.php.net/manual/en/function.json-validate.php

vpfxa7rd

vpfxa7rd8#

只要按照json.org页面上给出的铁路图。[]和{}是最小可能的有效JSON对象。因此答案是[]和{}。

相关问题