将jquery.parseJSON与JavaScriptSerializer一起使用(如何获取双引号转义)

时间:2011-04-05 20:57:48

标签: jquery asp.net json jquery-templates

我遇到一个问题,显示一个jQuery模板,其中JSON直接写入HTML,然后在加载时传递给jquery模板以呈现屏幕的一部分。

我有一个加载模板的简单函数:

function templateLoader(templateID, containerID, serializedData) {
    var json = $.parseJSON(serializedData);
    $("#" + templateID).tmpl(json).appendTo("#" + containerID);
};

这是失败的,说JSON无效。这是调用者的样子:

<script type='text/javascript'>
jQuery(function () {
    templateLoader('questionTemplate', 
      'questionContainer', 
      '[{"ID":1,"Text":"something with an escaped \"double quote\" and a single quote does the unicode version\u0027s end of string"}]');
});
</script>

JSON是通过调用JavaScriptSerializer.serialize()生成的,并在ASP.NET MVC视图中输出&lt;%= JavaScriptSerializer.serialize(model.questions)%&gt;

JSON本身传递了各种JSON验证测试。

据我所知,javascript本身正在转义双引号,为了调用jQuery的parseJSON()而将双引号保留为裸。

我的问题是哪里可以解决这个问题?我应该发布处理JavaScriptSerializer序列化调用以添加额外的转义或从转义转换为执行&amp; quot;替代品?这似乎是一个更常见的问题。

3 个答案:

答案 0 :(得分:3)

如果您正在嵌入它,为什么要使用JSON或JSON.parse?为什么不只是文字:

templateLoader('questionTemplate', 
  'questionContainer', 
  [{"ID":1,"Text":"something with an escaped \"double quote\" and a single quote does the unicode version\u0027s end of string"}]);

显然,您必须相应地修改templateLoader。您可以将serializedData更改为json(除了该名称具有误导性,因为json实际上是一个数组,不是一个JSON字符串),然后删除第一个功能线。

答案 1 :(得分:3)

(对于那些与同一问题作斗争的人)

使用HttpUtility.JavaScriptStringEncode

您的服务器代码将变为

<%= HttpUtility.JavaScriptStringEncode(JavaScriptSerializer.serialize(model.questions)) %>

答案 2 :(得分:1)

你能试试吗?

<script type='text/javascript'>
jQuery(function () {
    templateLoader('questionTemplate', 
      'questionContainer', 
      '[{"ID":1,"Text":"something with an escaped \\\"double quote\\\" and a single quote does the unicode version\u0027s end of string"}]');
});
</script>