jquery 1.9.1无法解析包含转义反斜杠的JSON

时间:2014-09-04 15:57:12

标签: javascript jquery asp.net json

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

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

Has\Backslash

并且像这样逃避它:

Has\\Backslash

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

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

当我通过JsonLint运行它时会抛出一个解析错误:

{"HasBackslash":"Has\Backslash"}

在IE9 / jquery 1.9.1中,完全相反是可以接受的。由JavascriptSerializer在服务器上创建的Javascript位在浏览器中失败并显示错误“无效字符”:

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>

2 个答案:

答案 0 :(得分:3)

你得出了错误的结论。您正在改变评估数据的环境以及导致看似矛盾的结果的原因。

让我们从。

开始
{"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字符串中,就应该没问题。

答案 1 :(得分:1)

感谢您耐心@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);