【问题标题】:How can I manage ' in a JSONP response?如何在 JSONP 响应中管理 '?
【发布时间】:2012-03-14 23:03:56
【问题描述】:

我需要在我的 JSONP 请求中管理像 ' 这样的字符,通过 jquery 处理 Ajax。所以(来自 C#)这就是我所做的:

myText = "Hello I'm a string";
myText.Replace("'", "\'");
Response.Write(Request["callback"] + "({ htmlModulo: '" + myText + "'});");

但在客户端它坏了:

parsererror - SyntaxError: missing } after property list

那么,如果替换不起作用,我该如何管理 '

【问题讨论】:

  • 只是一个想法,使用 ascii 代码吗? utf8_encode
  • 不,我还需要使用 html/script!示例:
    应该保持原样!

标签: c# jquery ajax json jsonp


【解决方案1】:

保留文本原样,但在 json 中使用双引号将其转义:

Response.Write(Request["callback"] + "({ htmlModulo: \"" + myText + "\"});");

你也可以试试这个:

var jsonSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            string json = jsonSerializer.Serialize(yourCustomObject);

然后我也离开this

【讨论】:

  • 是的,但现在如果在我的文本中我有",它会再次崩溃:)
【解决方案2】:

你需要这样做:

myText.Replace("'", "\\'");

如果您想在 htmlModulo 属性的值中使用转义单引号。但是,您的实际 JSON 仍然无效。根据the specification,您应该使用双引号将键名和值括起来。因此,为了使您的回复有效,您需要发送:

{"htmlModulo": "myText value"}

这对 JSONP 来说并不重要,因为它依赖于向 DOM 中插入一个新的脚本元素。因此,即使是不正确的 JSON 也会被 JavaScript 解释器正确解释。问题是您是否曾经以纯 JSON 格式请求数据。如果您这样做,那么您现在发送它的方式将因各种库而失败。特别是,jQuery 会因不正确的 JSON 静默失败。

【讨论】:

  • 使用.Replace("'", "\\'"); 它在客户端也失败了:parsererror - SyntaxError: missing } after property list
  • 如果您的脚本不发送一些示例文本,这是我能建议的最好方法。
  • 在客户端使用myText = "Hello I'm a string"; myText.Replace("'", "\\'"); 我得到jQuery17109806225378866104_1330091829763({ htmlModulo: 'Hello I'm a string'});
  • 这是从网络检查器复制和粘贴的结果吗?还是 Web 服务器提供的原始数据?如果它来自网络检查器,则不会显示控制序列。
【解决方案3】:

.NET 已经为您解决了序列化 JSON 的问题。使用System.Web.Script.Serialization.JavaScriptSerializer

var serializer = new JavaScriptSerializer();

要构造 JSONP,您只需连接前缀(硬编码或传入“回调”查询参数)和后缀(通常只是 ),但有时您可能需要传递额外参数,具体取决于调用者的期望,例如 @987654327 @ ) 与 JSON 文本。

下面的示例显示了基于“回调”参数构造 JSONP,根据您的需要替换 jsonpPrefix 的值。

var myText = "Hello I'm a string";
var jsonpPrefix = Request["callback"]  + "(";
var jsonpSuffix = ")";
var jsonp = 
    jsonpPrefix + 
    serializer.Serialize(new {htmlModulo = myText}) + 
    jsonpSuffix);
Response.Write(jsonp);

您应该始终使用序列化程序,因为自己操作意味着您更有可能搞砸并违反 JSON 规范。例如,您没有引用键,即required by JSON,因此 jQuery 和其他 JSON 解析器会很困惑。它也会处理所有需要转义的字符。

有关构造 JSON 的更多信息,请参阅How to create JSON string in C#

【讨论】:

  • @markzzz JSON 对允许的内容非常严格。 JSON 的部分意义在于它是一种数据格式,因此您不应该在其中放入任意代码。此外,一旦将 JSON 加载到 JS 中,“\u003cdiv”就与“
猜你喜欢
  • 2018-01-22
  • 2017-08-21
  • 2018-11-18
  • 2022-06-11
  • 2017-05-01
  • 2017-06-20
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
相关资源
最近更新 更多