根据JSON网站上的状态机图,仅允许转义的双引号字符,不允许单引号。单引号字符不需要转义:
更新 -有兴趣者的更多信息:
Douglas Crockford没有具体说明为什么JSON规范不允许在字符串中使用转义的单引号。但是,在他的JavaScript附录E:好的部分中对JSON的讨论中,他写道:
JSON的设计目标是最小化,可移植,文本化以及JavaScript的子集。我们需要达成共识以进行互操作的次数越少,我们就越容易进行互操作。
因此,也许他决定只允许使用双引号定义字符串,因为这是所有JSON实现都必须同意的较少规则。结果,字符串中的单引号字符不可能意外终止该字符串,因为根据定义,字符串只能以双引号字符终止。因此,无需在正式规范中转义单引号字符。
深入研究一下,Crockford的JSON for Java 的
org.json实现更为允许,并且
确实允许使用单引号字符:
toString方法产生的文本严格遵守JSON语法规则。构造函数在接受的文本中更为宽容:
...
这由JSONTokener源代码确认。该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
首先尝试使用浏览器的本机JSON解析器或已加载的库(例如json2.js)(如果适用)(附带说明的是jQuery逻辑基于的库,如果JSON
未定义) 。因此,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也是如此。