如何无需转换为JSON将C#数组传入JavaScript数组?及转义报错解决
这个问题我之前也碰到过,核心原因是你直接把序列化后的JSON字符串嵌入到JavaScript的单引号字面量里时,JSON里的双引号会提前闭合字符串,导致JavaScript语法错误,自然jQuery.parseJSON就会抛出异常。比如当Message是hello "world"时,序列化后的JSON是{"Message":"hello \"world\""},嵌入到'<%= result %>'后就变成了'{"Message":"hello "world""}'——这里hello后面的双引号直接结束了单引号包裹的字符串,剩下的内容完全不符合语法。
下面给你几个靠谱的解决方法:
方法一:直接将JSON作为JavaScript对象嵌入(推荐)
JSON本身就是合法的JavaScript对象字面量,所以不需要把它包裹成字符串再解析。直接把序列化后的结果赋值给变量即可:
后台C#代码不变:
JavaScriptSerializer _serializer = new JavaScriptSerializer(); string result = _serializer.Serialize(myList);
前端JavaScript代码改成:
var alerts = <%= result %>;
这样页面渲染后会直接生成合法的JavaScript数组,比如:
var alerts = [{"Id":1,"Message":"hello \"world\""}];
完全不需要jQuery.parseJSON,直接就能使用alerts数组,既高效又避免了转义问题。
方法二:对JSON字符串进行JavaScript转义
如果你必须用字符串解析的方式,可以用HttpUtility.JavaScriptStringEncode把序列化后的JSON转成合法的JavaScript字符串字面量:
后台C#代码:
JavaScriptSerializer _serializer = new JavaScriptSerializer(); string result = _serializer.Serialize(myList); // 对字符串进行JavaScript转义 string encodedResult = HttpUtility.JavaScriptStringEncode(result);
前端JavaScript代码:
var alerts = jQuery.parseJSON('<%= encodedResult %>');
JavaScriptStringEncode会把所有可能破坏字符串结构的字符(比如双引号、单引号、换行符等)都转义,确保嵌入到单引号里的字符串是完全合法的。
方法三:换用更标准的JSON序列化库(Json.NET)
JavaScriptSerializer是比较老旧的库,推荐换成Newtonsoft.Json(也就是Json.NET),它的序列化更标准,处理特殊字符也更可靠:
后台C#代码(需要先安装Newtonsoft.Json NuGet包):
string result = JsonConvert.SerializeObject(myList);
然后同样用方法一的方式直接嵌入到前端:
var alerts = <%= result %>;
这个方案既解决了转义问题,也让序列化的结果更符合JSON标准。
内容的提问来源于stack exchange,提问作者Sadegh Alinejad

