当前位置: 首页 > 面试题库 >

jQuery.parseJSON由于JSON中的单引号转义而引发“无效JSON”错误

范霄
2023-03-14
问题内容

我正在使用向服务器发出请求,jQuery.post()并且服务器正在返回JSON对象(如{ “var”: “value”, … })。但是,如果任何一个值都包含一个单引号(正确转义为'),则jQuery无法解析其他有效的JSON字符串。这是我的意思的示例(在Chrome的控制台中完成):

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网站上的状态机图,仅允许转义的双引号字符,不允许单引号。

更新-有兴趣者的更多信息:

Douglas Crockford没有具体说明为什么JSON规范不允许字符串中的转义单引号。但是,在他的JavaScript附录E:The Good Parts中对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)(附带说明的是,如果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也是如此。



 类似资料:
  • 问题内容: 这实际上有什么区别? 这工作正常: 但以下操作无效: 这是为什么? 问题答案: 那是因为双引号被认为是标准的,而单引号却没有。这并不是真正针对JQuery,而是关于JSON标准。因此,无论使用JS工具包,您都应该期待相同的行为。 值可以是带双引号的字符串,也可以是数字,也可以是true或false或null,或者是对象或数组。这些结构可以嵌套。

  • 从数据库中获取数据并通过DataTables显示时遇到问题。我发现我的大部分数据都有单引号和双引号以及其他特殊字符。我尝试了PHP中的所有转义函数,但都不起作用。addslashes只检索40,000个数据中的59个数据。到目前为止,我有了以下代码: PHP:

  • 问题内容: 我的代码: 定义是错误的 定义是正确的 我听说在Python中 单 引号和 双 引号可以互换。谁能向我解释一下? 问题答案: JSON语法不是Python语法。JSON的字符串需要双引号。

  • 问题内容: 如何在Python中用反斜杠和双引号替换双引号? 我想得到以下内容: 问题答案: 当您只要求’s’时,它会为您转义\,在打印时,您会看到字符串处于更“原始”状态。所以现在

  • 问题内容: 样例代码: 它适用于 PHP 5.5.3, 但对于较低版本的PHP则失败 它可以在我的装有PHP 5.5.3的计算机上使用,但是在其他地方都无法使用。 我知道这是错误的JSON,但我的网络服务向我提供了带有符号的JSON 和 沙盒 如何在PHP 5.3中使用撇号解析JSON数据? 显然,我要解析的原始JSON更复杂。 (我无法在生产服务器上升级PHP,也无法从Web服务获取正确的JSO

  • 问题内容: 我正在尝试显示双引号,但它显示的是反斜杠之一: 在html中呈现时,显示为。正确的方法是什么? 问题答案: 试试这个: (在引号前只需一个反斜杠())。