根据JSON website上的状态机图,只允许转义双引号字符,不允许单引号.单引号字符不需要转义:
Update - More information for those that are interested:
Douglas Crockford没有明确说明为什么JSON规范不允许字符串中的转义单引号.然而,在Appendix E of JavaScript: The Good Parts年讨论JSON时,他写道:
JSON的设计目标是最小化、可移植、文本化,并且是JavaScript的一个子集.为了互操作,我们需要达成的共识越少,我们就越容易进行互操作.
所以,也许他决定只允许使用双引号定义字符串,因为这是所有JSON实现都必须同意的少一条规则.因此,字符串中的单引号字符不可能意外终止字符串,因为根据定义,字符串只能由双引号字符终止.因此,不需要允许在正式规范中转义单个引号字符.
Digging a little bit deeper, Crockford's
org.json implementation of JSON for Java is more permissible and
does allow single quote characters:
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;
...
在方法的顶部是一条信息性 comments :
正式的JSON格式不允许单引号中的字符串,但允许实现接受它们.
因此,一些实现将接受单引号,但您不应该依赖于此.在这方面,许多流行的实现都有很大的限制,它们会拒绝包含单引号字符串和/或转义单引号的JSON.
最后,为了将这一点与原始问题联系起来,jQuery.parseJSON
首先try 使用浏览器的原生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也不接受单引号.