我的HTTP REQUEST包含一个有效的JSON字符串,其名称为“jo”的中间带有双引号,如此处所示“被转义”(由Fiddler Web Debugger捕获)
{"name":"firstName","value":"jo\"hn"},
注意:请求提交过程使用标准jQuery $.ajax(..)
调用as seen in this article而没有问题。
我的C#ASMX Web服务方法接收以下C#字符串值,其中间双引号未转义(即已删除反斜杠)。如果不导致下面的错误,则无法反序列化。
在我收到我的网络方法的价值之前,这是流程中不相交的地方。就像ASP.NET在内部处理字符串一样,通过取消它并将其重新放回而没有转义,改变原始值而不是逐字地提供给web方法参数。
C#String是:
{"name":"firstName","value":"jo"hn"},
ASMX Web方法大致是:
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!
可以理解的例外情况是:
{“传入无效对象,':'或'}'预期。(423): [{\ “名称\”:\ “PLC $ LT $ zoneHeaderTopNav $ searchBoxTopNav $ txtWord \”,\ “值\”:\ “\”},{\ “名称\”:\ “称呼\”,\“值\ “:\” \先生 “},{\” 名称\ “:\” 名字\”,\ “价值\”:\ “JOH \” N \ “},{\” 名称\ “:\” 姓氏\ “\ ”值\“:\ ”史密斯\“},{\ ”名称\“:\ ”初始\“,\ ”值\“:\ ”d \“}]”}
如何在不改变经典ASMX Web服务的情况下最好地解决此问题?
我可能会考虑使用前端处理程序来清理传入的请求,或者可能在Web服务方法的开头运行字符串清理。也许是一个不同的JSON库。
但是我想知道是否有一个简单的答案:调整配置,使用属性,设置或重载方法可以解决问题?
我已经在互联网上做了相当多的讨论,但大多数文章都涉及从服务器返回JSON数据到客户端并处理该领域的问题。
附录注释:Darin Dimitrov
要求的完整客户端电话详情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片段。
答案 0 :(得分:3)
为什么要在Web服务中执行这种可怕的手动JSON反序列化?让我建议你一个更好的方法。
首先定义一个模型:
public class Person
{
public string Name { get; set; }
public string Value { get; set; }
}
然后是一个网络方法:
[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);
}
});
再也没有kabooms了。
此处显示的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
});
需要注意的事项:您不需要使用regeular表达式来删除单引号,您应该使用JSON.stringify
来正确编码您的请求值。