我使用jQuery.post()向服务器发出请求,服务器返回JSON对象(比如{ "var": "value", ... }).但是,如果其中任何一个值包含一个引号(正确转义,如\'),jQuery将无法解析其他有效的JSON字符串.下面是我的意思(done in Chrome’s console)的一个例子:

data = "{ \"status\": \"success\", \"newHtml\": \"Hello \\\'x\" }";
eval("x = " + data); // { newHtml: "Hello 'x", status: "success" }

$.parseJSON(data); // Invalid JSON: { "status": "success", "newHtml": "Hello \'x" }

这正常吗?难道没有办法通过JSON正确传递单个报价吗?

推荐答案

根据JSON website上的状态机图,只允许转义双引号字符,不允许单引号.单引号字符不需要转义:

http://www.json.org/string.gif


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也不接受单引号.

Javascript相关问答推荐

Vega中的模运算符

按钮未放置在html dis位置

django无法解析余数:[0] from carray[0]'

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

使用i18next在React中不重新加载翻译动态数据的问题

我们如何从一个行动中分派行动

如何在Angular17 APP中全局设置AXIOS

如何将数据块添加到d3力有向图中?

第三方包不需要NODE_MODULES文件夹就可以工作吗?

使用Nuxt Apollo在Piniastore 中获取产品细节

让chart.js饼图中的一个切片变厚?

JavaScript不重定向配置的PATH

邮箱密码重置链接不适用于已部署的React应用程序

将对象推送到数组会导致复制

每次重新呈现时调用useState initialValue函数

用另一个带有类名的div包装元素

按特定顺序将4个数组组合在一起,按ID分组

通过解构/功能组件接收props-prop验证中缺少错误"

设置复选框根据选中状态输入选中值

扩散运算符未按预期工作,引发语法错误