我的HTTP请求包含一个有效的JSON字符串,名称“jo\”hn中间的双引号如这里所示(由Fiddler Web Debugger捕获)
{"name":"firstName","value":"jo\"hn"},
注意:请求提交过程使用标准的jQuery $.ajax(..)
调用如本文所示,没有问题。
服务器端问题
我的C# ASMX服务方法接收以下具有中间双引号未转义的C#字符串值(即反斜杠已被删除)。如果不导致下面看到的错误,就不能反序列化。
在我将值输入到我的web方法之前,这就是流程中不相交的地方。这就好像ASP.NET正在内部处理字符串,方法是取消转义,并将它放在一起,没有转义,而是更改原始值,而不是逐字提供给web方法参数。
C#字符串是:
{"name":"firstName","value":"jo"hn"},
ASMX方法大致是:
using System.Web.Script.Serialization;
using System.Web.Script.Services;
[WebMethod]
[ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
public string saveData(string values)
{
JavaScriptSerializer json = new JavaScriptSerializer();
request = json.Deserialize<List<NameValuePair>>(values.ToString());
// ^^^ KABOOM!
可以理解的例外消息是:
{\"name\":\"plc$lt$zoneHeaderTopNav$searchBoxTopNav$txtWord\",{“\”:\“值\”:\\“\”},{\“名称”:\“敬请”,\“值\”:\“Mr\”},{\“name\”:\“firstName”,\“value\”:\“joh\”n\},{\"name\":\"lastName\",\"value\":\"smith\"},{\"name\":\"initial\",\“value\”:\“d\”}}
如何在不改变经典ASMX web服务的情况下,最好地解决这个问题?
我可能会考虑一个前端处理程序来清理传入的请求,或者在web服务方法的开头运行一个字符串清理。也许是另一个JSON库。
然而,我想知道是否有一个简单的答案:调整配置、使用属性、设置或重载方法来解决问题?
我在Internet上做了相当多的研究,但大多数文章都涉及将JSON数据从服务器返回到客户端,并处理该领域的问题。
增编注:达林·季米特洛夫要求的客户端电话详细信息
更新:达林的答案在这里内联发布,便于参考
function SaveDraft() {
$.checklist.checkvalid();
var formObj = $(':input:not([type=hidden])').serializeArray();
var request = JSON.stringify(formObj);
request = request.replace(/'/g, "");
$.ajax({
url: "/Service.asmx/saveData",
type: "POST",
// *** Original erroneous line: uses string concat - commented out
// data: "{'values':'" + request + "'}",
// *** CORRECTED LINE: provides an object instead of a string and calls JSON stringify.
data: JSON.stringify({ values: request }),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: SaveDraftSuccess,
error: SaveDraftFail
});
}
注意:这是生成问题顶部显示的有效JSON片段的调用的实施例。
发布于 2012-01-25 22:42:03
为什么要在web服务中执行这种可怕的手动JSON反序列化?让我给你建议一个更好的方法。
首先定义一个模型:
public class Person
{
public string Name { get; set; }
public string Value { get; set; }
}
然后是一个web方法:
[WebMethod]
[ScriptMethod]
public string SaveData(Person person)
{
...
}
然后你可以从javascript调用它。例如,使用jQuery:
$.ajax({
url: 'foo.asmx/SaveData',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
person: {
name: 'firstName',
value: ' jo\"h\'n'
}
}),
success: function(result) {
alert(result.d);
}
});
再也没有卡伯斯了。
这里显示的JSON.stringify
方法是内置的现代浏览器,但是如果您需要支持遗留浏览器,您可以将json2.js脚本包含到页面中。
更新:
现在,您已经显示了您的代码,似乎您没有编码您的请求。就像这样:
var formObj = $(':input:not([type=hidden])').serializeArray();
var request = JSON.stringify(formObj);
$.ajax({
url: "/Service.asmx/saveData",
type: "POST",
data: JSON.stringify({ values: request }),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: SaveDraftSuccess,
error: SaveDraftFail
});
需要注意的是:您不需要正则表达式来删除单引号,您应该使用JSON.stringify
正确地编码请求值。
https://stackoverflow.com/questions/9011419
复制相似问题