根据JSON网站上的状态机图,只允许转义的双引号字符,不允许单引号。单引号字符不需要转义:
更新-为那些感兴趣的人提供更多信息:
Douglas Crockford没有具体说明为什么JSON规范不允许在字符串中转义单引号。然而,在他在《JavaScript: The Good Parts》的附录E中讨论JSON时,他写道:
JSON的设计目标是最小化、可移植、文本化,并且是JavaScript的子集。为了实现互操作,我们需要的共识越少,我们就越容易实现互操作。
因此,也许他决定只允许使用双引号定义字符串,因为这减少了所有JSON实现必须同意的规则。因此,字符串中的单引号字符不可能意外地终止字符串,因为根据定义,字符串只能由双引号字符结束。因此,在正式规范中不需要允许转义单引号字符。
再深入一点,克罗克福德的组织。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(另一方面,如果没有定义JSON,则是jQuery逻辑所基于的库)。因此,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也不接受。