问题:如何在服务器上使用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>
答案 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);