首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >接收参数JSON中未转义双引号的ASMX web方法

接收参数JSON中未转义双引号的ASMX web方法
EN

Stack Overflow用户
提问于 2012-01-25 22:34:58
回答 1查看 3.3K关注 0票数 3

我的HTTP请求包含一个有效的JSON字符串,名称“jo\”hn中间的双引号如这里所示(由Fiddler Web Debugger捕获)

代码语言:javascript
复制
{"name":"firstName","value":"jo\"hn"},

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

服务器端问题

我的C# ASMX服务方法接收以下具有中间双引号未转义的C#字符串值(即反斜杠已被删除)。如果不导致下面看到的错误,就不能反序列化。

在我将值输入到我的web方法之前,这就是流程中不相交的地方。这就好像ASP.NET正在内部处理字符串,方法是取消转义,并将它放在一起,没有转义,而是更改原始值,而不是逐字提供给web方法参数。

C#字符串是:

代码语言:javascript
复制
{"name":"firstName","value":"jo"hn"},

ASMX方法大致是:

代码语言:javascript
复制
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数据从服务器返回到客户端,并处理该领域的问题。

增编注:达林·季米特洛夫要求的客户端电话详细信息

更新:达林的答案在这里内联发布,便于参考

代码语言:javascript
复制
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片段的调用的实施例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-25 22:42:03

为什么要在web服务中执行这种可怕的手动JSON反序列化?让我给你建议一个更好的方法。

首先定义一个模型:

代码语言:javascript
复制
public class Person
{
    public string Name { get; set; }
    public string Value { get; set; }
}

然后是一个web方法:

代码语言:javascript
复制
[WebMethod]
[ScriptMethod]
public string SaveData(Person person)
{
    ...
}

然后你可以从javascript调用它。例如,使用jQuery:

代码语言:javascript
复制
$.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脚本包含到页面中。

更新:

现在,您已经显示了您的代码,似乎您没有编码您的请求。就像这样:

代码语言:javascript
复制
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正确地编码请求值。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9011419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档