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

发布于 2024-10-30 05:36:27 字数 1000 浏览 3 评论 0原文

我在显示 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() 生成的,并通过 <%= JavaScriptSerializer.serialize(model.questions) %> 在 ASP.NET MVC 视图中输出。

JSON 本身通过了各种 JSON 验证测试。

我知道 javascript 本身正在转义双引号,使双引号裸露在调用 jQuery 的 parseJSON() 上。

我的问题是哪里最好解决这个问题?我是否应该对 JavaScriptSerializer 序列化调用进行后处理以添加额外的转义或从转义更改为执行 &quot; 操作?替代品?这似乎是一个更常见的问题。

I've run into a problem displaying a jQuery template where the JSON is written directly into the HTML, and then passed to jquery templates on load to render a part of the screen.

I have a simple function that loads the template:

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

This is failing, saying the JSON is invalid. Here's what the caller looks like:

<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>

The JSON is produced by a call to JavaScriptSerializer.serialize() and output in a ASP.NET MVC view with <%= JavaScriptSerializer.serialize(model.questions) %>

The JSON itself passes the various JSON validation tests.

I understand that javascript itself is escaping the double quotes, leaving the double quotes naked for the call to jQuery's parseJSON().

My question is where best to fix this? Should I post process the JavaScriptSerializer serialize call to add additional escaping or change from escaping to doing " replacements? This seems like it would be a more common problem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

樱花落人离去 2024-11-06 05:36:27

如果要嵌入它,为什么还要使用 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 字符串),然后删除函数的第一行。

If you're embedding it, why use JSON or JSON.parse at all? Why not just literals:

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

Clearly, you have to modify templateLoader accordingly. You can change serializedData to json (except that the name is misleading, since json is actually an array, not a JSON string), then delete the first line of the function.

装迷糊 2024-11-06 05:36:27

(对于那些遇到同样问题的人)

使用 HttpUtility.JavaScriptStringEncode

你的服务器标签将变得像

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

(for some one who fighting the same issue)

Use HttpUtility.JavaScriptStringEncode

Your server tag will become like

<%= HttpUtility.JavaScriptStringEncode(JavaScriptSerializer.serialize(model.questions)) %>
墨落成白 2024-11-06 05:36:27

你能试试这个吗?

<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>

Can you try this?

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文