【问题标题】:jquery 1.9.1 fails to parse JSON that contains escaped backslashjquery 1.9.1 无法解析包含转义反斜杠的 JSON
【发布时间】:2014-10-29 11:14:56
【问题描述】:

问题:我如何在服务器上使用 asp.net JavascriptSerializer 创建 JSON 字符串,这些字符串将始终与 IE 9 中的 jquery 1.9.1 parseJSON() 方法一起使用?

在服务器上,我在一个对象上调用 JavascriptSerializer.Serialize() 以将其转换为 JSON 字符串。该对象具有可以包含反斜杠的属性。所以 JavascriptSerializer 采用这样的值:

Has\Backslash

然后像这样转义它:

Has\\Backslash

当我通过 JsonLint 运行生成的 JSON 字符串时,它得到了验证:

{"HasBackslash":"Has\\Backslash"}

当我通过 JsonLint 运行它时,它会引发解析错误:

{"HasBackslash":"Has\Backslash"}

在 IE9/jquery 1.9.1 中,完全相反是可以接受的。 JavascriptSerializer 在服务器上创建的 Javascript 位在浏览器中失败,错误为“Invalid Character”:

var HasBackslash = $.parseJSON('{"HasBackslash":"Has\\Backslash"}');

但是这段 Javascript 工作得很好:

var HasBackslash = $.parseJSON('{"HasBackslash":"Has\Backslash"}');

这是完整的示例,我使用的是 jquery 1.9.1 和 IE 9。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>The Title</title>
<script type="text/javascript" src="jquery-1.9.1.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        try {
            var NoBackslash = $.parseJSON('{"NoBackslash":"No Backslash"}');
            $('#NoBackslash').text('NoBackslash parsed successfully');
        }
        catch(err){
            $('#NoBackslash').text('Error parsing NoBackslash: ' + err.message);
        }

        try {
            var HasBackslash = $.parseJSON('{"HasBackslash":"Has\Backslash"}');
            $('#HasBackslash').text('HasBackslash parsed successfully');
        }
        catch (err) {
            $('#HasBackslash').text('Error parsing HasBackslash: ' + err.message);
        }


        try {
            var HasEscapedBackslash = $.parseJSON('{"HasEscapedBackslash":"Has\\Backslash"}');
            $('#HasEscapedBackslash').text('HasEscapedBackslash parsed successfully');
        }
        catch(err){
            $('#HasEscapedBackslash').text('Error parsing HasEscapedBackslash: ' + err.message);
        }

    });
</script>
</head>
<body>
    <p id='NoBackslash'></p>
    <p id='HasBackslash'></p>
    <p id='HasEscapedBackslash'></p>
</body></html>

【问题讨论】:

    标签: javascript jquery asp.net json


    【解决方案1】:

    你得出了错误的结论。您正在改变评估数据的环境,这就是为什么您会得到看似矛盾的结果。

    让我们开始吧。

    {"HasBackslash":"Has\Backslash"}
    

    这是无效的 JSON,因为 \B 是无效的转义序列。

    {"HasBackslash":"Has\\Backslash"}
    

    是有效的,因为\\ 是一个有效的转义序列。解析 JSON 时,会创建字符 \

    现在:

    $.parseJSON('{"HasBackslash":"Has\\Backslash"}');
    

    由于您正在使用其中\ 也是转义字符的JavaScript 字符串,因此\ 被认为是字符串文字的一部分。试试看

    > console.log('{"HasBackslash":"Has\\Backslash"}');
    {"HasBackslash":"Has\Backslash"}
    

    你看,字符串值,也就是传递给$.parseJSON的真实值,和第一个一样,是无效的。

    然而,

    $.parseJSON('{"HasBackslash":"Has\Backslash"}');
    

    有效,因为您再次使用 JavaScript 字符串,所以被解析的值是

    > console.log('{"HasBackslash":"Has\Backslash"}');
    {"HasBackslash":"HasBackslash"}
    

    不包含反斜杠。


    所以,只要您不将生成的 JSON 嵌入到 JavaScript 字符串中,就可以了。

    【讨论】:

    • 我试图在我的回答中解释这一点:它没有。 {"HasBackslash":"Has\\Backslash"} 是有效的 JSON。但是,当您从字面上将其用作 string 的值时,\\ 将被视为 string 的转义字符,而不是 JSON 值,您最终会解析无效 JSON ,如我的回答所示。
    • 当您说“只要您不将生成的 JSON 嵌入到 JavaScript 字符串中”时,这是什么意思?您将如何避免这样做?
    • 这意味着你不应该将 JSON 作为字符串注入到 JS 代码中。例如。不要这样做var foo = '&lt;% print JSON %&gt;';,其中&lt;% ... %&gt; 是服务器端模板语言的一部分。 JSON 通常作为来自服务器的响应返回或直接嵌入到 JS 代码中作为赋值的值,例如var foo = &lt;% print JSON %&gt;;。然后,当执行 JS 时,JSON 实际上将被评估为对象字面量。 “你将如何避免这样做?” 只是不要这样做。这不是偶然发生的事情,如果它发生了,你就是在明确地这样做。
    • 哦,看在上帝的份上,现在我明白了,非常感谢。我将添加另一个答案,以说明我在服务器端做错了什么。
    • 你好,我也遇到了类似的问题,一直没有结束,因为首先将字符串解析为json,并开始在winbdow中作为字符串使用,所以开始显示
      json | json
      所以给反斜杠
    【解决方案2】:

    感谢您的耐心@Felix Kling。总之,这就是我做错了什么。服务器端我首先从一个对象创建一个 JSON 字符串:

    string jsonString = new JavaScriptSerializer.Serialize(myObject);
    

    然后,从服务器,将这段 javascript 注入页面:

    "var o = $.parseJSON('" + jsonString + "');";
    

    问题在于对 $.parseJSON 的调用。这不是必需的;我已经有一个现成的 JSON 对象。我只需要注入以下内容:

    "var o = " + jsonString + ";";
    

    而且,如果您在 Javascript 块中的 MVC cshtml 页面中执行此操作,请记住以 Html.Raw() 开头:

    var o = @Html.Raw(jsonStringVariable);    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多