如何在JSONP响应中管理?

时间:2012-02-24 13:43:04

标签: c# jquery ajax json jsonp

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

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

但在客户方面,它破了:

parsererror - SyntaxError: missing } after property list

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

3 个答案:

答案 0 :(得分:6)

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

var serializer = new JavaScriptSerializer();

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

下面的示例显示了基于“回调”参数构建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解析器将非常混淆。它还将处理所有需要转义的字符。

可以在How to create JSON string in C#中找到有关构建JSON的更多信息。

答案 1 :(得分:2)

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

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

你也可以尝试这个:

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

然后我也离开this

答案 2 :(得分:-1)

您需要这样做:

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

如果您希望在htmlModulo属性的值中使用转义单引号。但是,您的实际JSON仍然无效。根据{{​​3}},您应该使用双引号来包围键名和值。因此,为了使您的回复有效,您需要发送:

{"htmlModulo": "myText value"}

JSONP真的无关紧要,因为它依赖于在DOM中插入新的脚本元素。因此,即使是不正确的JSON也会被JavaScript解释器正确解释。问题是,如果您要求数据为普通JSON。如果你这样做,那么你现在发送它的方式将失败,有各种各样的库。特别是,jQuery将使用不正确的JSON静默失败。