bes*_*bov 157 javascript validation json
我仔细阅读了JSON描述http://json.org/,但我不确定我是否知道这个简单问题的答案.哪些字符串是最小可能的有效JSON?
"string" 字符串是有效的JSON吗?42 是简单的数字有效JSON?true 布尔值是有效的JSON吗?{} 空对象是有效的JSON吗?[] 空数组是一个有效的JSON吗?Mat*_*att 140
在撰写本文时,JSON仅在RFC4627中描述.它描述了(在"2"的开头)JSON文本作为序列化对象或数组.
这意味着只有 {}并且[]是符合该标准的解析器和字符串中有效的完整JSON字符串.
但是,ECMA-404的引入改变了这一点,并且可以在此处阅读更新的建议.我还写了一篇关于这个问题的博客文章.
然而,为了进一步混淆这个问题,Web浏览器中可用的JSON对象(例如JSON.parse()和JSON.stringify())在ES5中是标准化的,并且明确定义了可接受的JSON文本,如下所示:
本规范中使用的JSON交换格式正是RFC 4627所描述的格式,但有两个例外:
ECMAScript JSON语法的顶级JSONText生成可以包含任何JSONValue,而不是限制为RFC 4627指定的JSONObject或JSONArray.
剪断
这意味着JSON对象接受所有 JSON值(包括字符串,空值和数字),即使JSON对象在技术上遵守RFC 4627.
请注意,您可以在符合标准的浏览器中对数字进行字符串化JSON.stringify(5),这将被另一个符合RFC4627的解析器拒绝,但是没有上面列出的特定异常.例如,Ruby 似乎就是这样一个例子,只接受对象和数组作为根.另一方面,PHP 特别添加了 "它还将编码和解码标量类型和NULL" 的异常.  
Joh*_*ann 39
互联网上至少有四个可以被视为JSON标准的文件.所引用的RFC都描述了mime类型application/json.以下是每个人对顶级值的看法,以及顶部是否允许除对象或数组以外的任何内容:
RFC-4627:不.
JSON文本是一系列标记.标记集包括六个结构字符,字符串,数字和三个文字名称.
JSON文本是序列化对象或数组.
JSON-text =对象/数组
请注意,RFC-4627被标记为"信息性"而不是"建议标准",并且它被RFC-7159废弃,而RFC-7159又被RFC-8259淘汰.
RFC-8259:是的.
JSON文本是一系列标记.标记集包括六个结构字符,字符串,数字和三个文字名称.
JSON文本是序列化值.请注意,某些先前的JSON规范将JSON文本约束为对象或数组.只生成调用JSON文本的对象或数组的实现将是可互操作的,因为所有实现都将接受这些作为符合JSON文本.
JSON-text = ws值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代码点形成的标记序列.该组令牌包括六个结构标记,字符串,数字和三个文字名称标记.
根据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根据本手册页中的示例, Python 接受任何"JSON值"区别有点像"XML文档"和"XML片段"之间的区别,虽然技术上<foo />是一个格式良好的XML文档(它可以更好地编写<?xml version="1.0" ?><foo />,但在评论中指出,<?xml声明在技术上是可选的).
ecma 规范可能可供参考:
http://www.ecma-international.org/ecma-262/5.1/
parse 函数解析 JSON 文本(JSON 格式的字符串)并生成 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("[]"); // []
JSON 代表 JavaScript 对象表示法。只有{}和[]定义JavaScript对象。其他示例是值文字。Javascript 中有用于处理这些值的对象类型,但表达式"string"是文字值的源代码表示,而不是对象。
请记住,JSON 不是 Javascript。它是一种表示数据的符号。它具有非常简单和有限的结构。JSON 数据是使用{},:[]字符结构化的。您只能在该结构中使用文字值。
服务器以对象描述或文字值进行响应是完全有效的。所有 JSON 解析器都应该处理只处理一个文字值,但只能处理一个值。JSON 一次只能表示一个对象。因此,对于要返回多个值的服务器,它必须将其构造为对象或数组。
| 归档时间: | 
 | 
| 查看次数: | 57446 次 | 
| 最近记录: |