我的http请求包含一个有效的JSON字符串,其中名称中间的双引用“jo \”hn“在此处逃脱(由Fiddler Web调试器捕获)

{"name":"firstName","value":"jo\"hn"},
.

注意:请求提交过程使用标准jquery $.ajax(..)调用如本文所见没有问题。


服务器侧问题

我的C#ASMX Web服务方法接收以下C#字符串值,该值具有中间双重引用(即删除了Backslash)。这不能被反序列化而不会导致下面的错误。

这是在我将值接收到Web方法之前发生的进程中的不相交的位置。它好像ASP.NET通过向内部涂抹并将其放在一起并将其放在一起,不会逃脱,更改原始值,而不是将其逐字提供给Web方法参数。

c#字符串是:

{"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! 
.

exception消息可以理解,是:

{“无效的对象传递,'或'或'}'。(423): [{\“名称\”:\“PLC $ LT LT ZoneHeaderTopNav $ SearchBoav $ txtword \”,\“value \”:\“\”},{\“name \”:\“致敬\”,\“值“:”Mr \“},{\”名称\“:\”firstname \“,\”value \“:\”joh \“n \”n},{\“name \”:\“lastname \ “,”值“:\”史密斯\“},{\”名称\“:\”初始\“,\”value \“:\”d \“}”。

如何在不改变经典的ASMX Web服务的情况下解决这个问题?

我可能会考虑一个清除传入请求的前处理程序,或者在Web服务方法的开头时运行String Cleanup。也许是一个不同的JSON库。

然而,我想知道是否有一个简单的答案:调整配置,使用属性,一个可能解决问题的设置或过载方法?

我已经在互联网上做了很多戳,但大多数文章都覆盖了从服务器返回客户端的JSON数据并处理该区域的问题。


附录注意 dimitrov

更新:Darin的答案在这里发布在此内联,便于参考
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片段的调用的实施例。

有帮助吗?

解决方案

为什么您在Web服务中执行此可怕的手册JSON Deserialization?让我建议你更好的方法。

首先定义模型:

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);
    }
});
.

不再是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
});
.

要注意的事情:您不需要ReAgular表达式来删除单引号,您应该使用JSON.stringify正确编码您的请求值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top