我需要在我的JSONP请求中管理'
之类的字符串,通过jquery进行Ajax处理。所以(来自C#)这就是我所做的:
myText = "Hello I'm a string";
myText.Replace("'", "\'");
Response.Write(Request["callback"] + "({ htmlModulo: '" + myText + "'});");
但在客户方面,它破了:
parsererror - SyntaxError: missing } after property list
那么,如果替换不起作用,我如何管理'
?
答案 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静默失败。