什么是最小有效JSON?

时间:2013-08-24 14:08:51

标签: javascript json validation

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

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

8 个答案:

答案 0 :(得分:124)

在撰写本文时,JSON仅在RFC4627中描述。它将JSON文本(在“2”的开头)描述为序列化对象或数组。

这意味着只有 {}[]是符合该标准的解析器和字符串中的有效完整JSON字符串。

然而,ECMA-404的引入改变了这一点,并更新了建议can be read here。我在这个问题上也written a blog post


为了进一步混淆此事,网络浏览器中提供的JSON对象(例如JSON.parse()JSON.stringify())为standardised in ES5,并明确定义了可接受的JSON文本像这样:

  

本规范中使用的JSON交换格式正是RFC 4627所描述的格式,但有两个例外:

     
      
  • ECMAScript JSON语法的顶级JSONText生成可能包含任何JSONValue,而不是限制为RFC 4627指定的JSONObject或JSONArray。

  •   
  • 剪断

  •   

这意味着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表示“它还将编码和解码标量类型和NULL”。

答案 1 :(得分:37)

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

RFC-4627 否。

  

JSON文本是一系列令牌。这组令牌包括六个      结构字符,字符串,数字和三个文字名称。

     

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

     
    

JSON-text = object / array

  

请注意,RFC-4627已标记为"信息"而不是"提议的标准",它被RFC-7159淘汰,而后者又被RFC-8259淘汰。

RFC-8259 是。

  

JSON文本是一系列令牌。这组令牌包括六个      结构字符,字符串,数字和三个文字名称。

     

JSON文本是序列化值。注意某些先前的      JSON的规范将JSON文本约束为对象或      阵列。仅生成对象或数组的实现      调用的JSON文本在所有方面都是可互操作的      实现将接受这些作为符合JSON文本。

     
    

JSON-text = ws value ws

  

RFC-8259的日期为2017年12月,并标有" INTERNET STANDARD"。

ECMA-262 是。

  

JSON语法语法根据JSON词法定义的标记定义有效的JSON文本     语法。语法的目标符号是JSONText。

     

语法     JSONText:

     
    

JSONValue

  
     

JSONValue:

     
    

JSONNullLiteral

         

JSONBooleanLiteral

         

JSONObject

         

JSONArray

         

JSONString

         

JSONNumber

  

ECMA-404 是。

  

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

答案 2 :(得分:9)

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

  

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

取决于所使用的解析器,单独的" JSON值"无论如何可能会被接受。例如(坚持" JSON值" vs" JSON文本"术语):

  • 现在浏览器中标准化的JSON.parse()函数接受任何" JSON值"
  • PHP函数json_decode是在5.2.0版本中引入的,只接受整个" JSON文本",但是被修改为接受任何" JSON值"在版本5.2.1
  • Python json.loads接受任何" JSON值"根据例子on this manual page
  • http://jsonlint.com处的验证人需要一个完整的" JSON文字"
  • Ruby JSON模块只接受完整的" JSON文本" (至少根据评论on this manual page

区别有点像&#34; XML文档&#34;和#34; XML片段&#34;虽然技术上<foo />是格式良好的XML文档(最好写成<?xml version="1.0" ?><foo />,但正如评论中指出的那样{{1}声明在技术上是可选的。)

答案 3 :(得分:4)

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

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

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

答案 4 :(得分:2)

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

然而,官方RFC 4627州:

  

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

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

答案 5 :(得分: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文字中   不使用转义序列。解析过程类似于受限制的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("[]"); // []

答案 6 :(得分:-1)

var x;
JSON.stringify(x); // will output "{}"

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

答案 7 :(得分:-2)

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