根据状态机图JSON 网站 http://www.json.org/,只允许转义双引号字符,不允许使用单引号。单引号字符不需要转义:
Update- 感兴趣的人可以了解更多信息:
Douglas Crockford 没有具体说明为什么 JSON 规范不允许在字符串中转义单引号。然而,在他讨论 JSON 时JavaScript 附录 E:好的部分 http://oreilly.com/javascript/excerpts/javascript-good-parts/json.html, 他写:
JSON 的设计目标是最小化、可移植、文本化和 JavaScript 的子集。我们为了互操作而需要达成的共识越少,我们就越容易进行互操作。
因此,也许他决定只允许使用双引号定义字符串,因为这是所有 JSON 实现都必须同意的一项规则。因此,字符串中的单引号字符不可能意外终止该字符串,因为根据定义,字符串只能由双引号字符终止。因此,在正式规范中不需要允许转义单引号字符。
Digging a little bit deeper, Crockford's
org.json http://www.json.org/java/index.html implementation of JSON for Java is more permissible and
does allow single quote characters:
toString 方法生成的文本严格符合 JSON 语法规则。建设者在他们接受的文本中更加宽容:
...
这得到了证实JSONTokener https://github.com/douglascrockford/JSON-java/blob/master/JSONTokener.java源代码。这nextString
方法接受转义的单引号字符并将它们视为双引号字符:
public String nextString(char quote) throws JSONException {
char c;
StringBuffer sb = new StringBuffer();
for (;;) {
c = next();
switch (c) {
...
case '\\':
c = this.next();
switch (c) {
...
case '"':
case '\'':
case '\\':
case '/':
sb.append(c);
break;
...
该方法的顶部是一条信息丰富的注释:
正式的 JSON 格式不允许单引号中的字符串,但允许实现接受它们。
因此,某些实现将接受单引号 - 但您不应该依赖于此。许多流行的实现在这方面都非常严格,并且会拒绝包含单引号字符串和/或转义单引号的 JSON。
最后将其与原来的问题联系起来,jQuery.parseJSON http://code.jquery.com/jquery-latest.js首先尝试使用浏览器的本机 JSON 解析器或加载的库,例如json2.js https://github.com/douglascrockford/JSON-js/blob/master/json2.js在适用的情况下(旁注是 jQuery 逻辑所基于的库 ifJSON
没有定义)。因此 jQuery 只能像底层实现一样宽松:
parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
jQuery.error( "Invalid JSON: " + data );
},
据我所知,这些实现仅遵循官方 JSON 规范,不接受单引号,因此 jQuery 也不接受单引号。