首页 文章

什么是最小有效JSON?

提问于
浏览
126

我仔细阅读了JSON描述http://json.org/但我不确定我知道这个简单问题的答案 . 哪些字符串是最小可能的有效JSON?

  • "string" 是字符串有效的JSON?

  • 42 是简单的有效JSON号码?

  • true 是一个有效JSON的布尔值?

  • {} 是空对象的有效JSON吗?

  • [] 是空数组的有效JSON吗?

8 回答

  • 111

    在撰写本文时,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交换格式正是RFC 4627所描述的格式,但有两个例外:ECMAScript JSON语法的顶级JSONText生成可以包含任何JSONValue,而不是限制为RFC指定的JSONObject或JSONArray . 4627.剪断

    这意味着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" .

  • 3

    互联网上至少有四个可以被视为JSON标准的文件 . 所引用的RFC都描述了mime类型 application/json . 以下是每个人对顶级值的看法,以及顶部是否允许除对象或数组以外的任何内容:

    RFC-4627No.

    JSON文本是一系列标记 . 标记集包括六个结构字符,字符串,数字和三个文字名称 . JSON文本是序列化对象或数组 . JSON-text =对象/数组

    请注意,RFC-4627标记为"informational"而不是"proposed standard",并且它被RFC-7159淘汰,而后者又被RFC-8259淘汰 .

    RFC-8259Yes.

    JSON文本是一系列标记 . 标记集包括六个结构字符,字符串,数字和三个文字名称 . JSON文本是序列化值 . 请注意,某些先前的JSON规范将JSON文本约束为对象或数组 . 只生成调用JSON文本的对象或数组的实现将是可互操作的,因为所有实现都将接受这些作为符合JSON文本 . JSON-text = ws值ws

    RFC-8259的日期为2017年12月,标有“INTERNET STANDARD” .

    ECMA-262Yes.

    JSON语法语法根据JSON词法语法定义的标记定义有效的JSON文本 . 语法的目标符号是JSONText . 语法JSONText:JSONValue JSONValue:JSONNullLiteral JSONBooleanLiteral JSONObject JSONArray JSONString JSONNumber

    ECMA-404Yes.

    JSON文本是由符合JSON值语法的Unicode代码点形成的标记序列 . 该组令牌包括六个结构标记,字符串,数字和三个文字名称标记 .

  • 2

    根据RFC 4627中的旧定义(已于2014年3月由RFC 7159废弃),这些都是有效的"JSON values",但只有最后两个将构成一个完整的"JSON text":

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

    根据所使用的解析器,无论如何都可能接受单独的“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 声明在技术上是可选的) .

  • 2

    JSON代表JavaScript Object Notation . 只有 {}[] 定义了一个Javascript对象 . 其他例子是 Value 文字 . Javascript中有对象类型用于处理这些值,但表达式 "string" 是文字值的源代码表示,而不是对象 .

    请记住,JSON不是Javascript . 它是表示数据的表示法 . 它有一个非常简单和有限的结构 . JSON数据使用 {},:[] 字符构造 . 您只能在该结构中使用文字值 .

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

  • 9

    是的,是的,是的,是的,是的 . 所有这些都是有效的JSON值文字 .

    然而,官方RFC 4627指出:

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

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

  • -2

    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 . JSON使用比WhiteSpace更有限的一组空白字符,并允许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("[]"); // []
    
  • -1
    var x;
    JSON.stringify(x); // will output "{}"
    

    所以你的答案是 "{}" ,表示一个空对象 .

  • 35

    只需按照json.org页面上给出的铁路图表进行操作即可 . []和{}是可能的最小有效JSON对象 . 所以答案是[]和{} .

相关问题