如何构建要发送到AJAX WebService的JSON对象?

时间:2010-04-29 13:10:09

标签: c# javascript jquery web-services json

尝试在javascript中手动格式化我的JSON数据并且惨遭失败后,我意识到可能有更好的方法。以下是C#中的Web服务方法和相关类的代码:

[WebMethod]
public Response ValidateAddress(Request request)
{
    return new test_AddressValidation().GenerateResponse(
        test_AddressValidation.ResponseType.Ambiguous);
}

...

public class Request
{
    public Address Address;
}

public class Address
{
    public string Address1;
    public string Address2;
    public string City;
    public string State;
    public string Zip;
    public AddressClassification AddressClassification;
}

public class AddressClassification
{
    public int Code;
    public string Description;
}

Web服务使用SOAP / XML很有效,但我似乎无法使用javascript和jQuery获得有效响应,因为我从服务器返回的消息与我的手动编码JSON有问题。

我无法使用jQuery getJSON函数,因为请求需要HTTP POST,因此我使用的是较低级别的ajax函数:

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
    data: "{\"Address\":{\"Address1\":\"123 Main Street\",\"Address2\":null,\"City\":\"New York\",\"State\":\"NY\",\"Zip\":\"10000\",\"AddressClassification\":null}}",
    dataType: "json",
    success: function(response){
        alert(response);
    }
})

ajax函数正在提交data:中指定的所有内容,这就是我的问题所在。如何在javascript中构建格式正确的JSON对象,以便我可以将其插入我的ajax调用中,如下所示:

data: theRequest

我最终会从表单中的文本输入中提取数据,但是现在硬编码的测试数据很好。

如何构建格式正确的JSON对象以发送到Web服务?


更新:事实证明我的请求的问题不是JSON的格式化,如T.J.指出,而是我的JSON文本不符合Web服务的要求。这是基于WebMethod中的代码的有效JSON请求:

'{"request":{"Address":{"Address1":"123 Main Street","Address2":"suite 20","City":"New York","State":"NY","Zip":"10000","AddressClassification":null}}}'

这提出了另一个问题:When is case sensitivity important in JSON requests to ASP.NET web services (ASMX)?

7 个答案:

答案 0 :(得分:12)

答案非常简单,并且基于之前的帖子Can I return JSON from an .asmx Web Service if the ContentType is not JSON?JQuery ajax call to httpget webmethod (c#) not working

数据应该是JSON编码的。您应该为每个输入参数分别编码。因为你只有一个参数,你应该这样做:

首先将数据构建为本机JavaScript数据,如:

var myData = {Address: {Address1:"address data 1",
                        Address2:"address data 2",
                        City: "Bonn",
                        State: "NRW",
                        Zip: "53353",
                        {Code: 123,
                         Description: "bla bla"}}};

然后作为ajax请求的参数{request:$.toJSON(myData)}

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
    data: {request:$.toJSON(myData)},
    dataType: "json",
    success: function(response){
        alert(response);
    }
})

而不是来自JSON插件的$ .toJSON,您可以使用http://www.json.org/

中的另一个版本(JSON.stringify)

如果你的WebMethod有像

这样的参数
public Response ValidateAddress(Request request1, Request myRequest2)

data调用的ajax参数的值应该类似

data: {request1:$.toJSON(myData1), myRequest2:$.toJSON(myData2)}

data: {request1:JSON.stringify(myData1), myRequest2:JSON.stringify(myData2)}

如果您更喜欢其他版本的JSON编码器。

答案 1 :(得分:5)

您的问题分为两部分:

创建JSON字符串

您引用的代码中的JSON完全有效。但手工制作是一种痛苦。正如其他人所说,最简单的方法是创建一个Javascript对象然后JSON.stringify。例如:

var data = {
    "Address": {
        "Address1": "123 Main Street",
        "Address2": null,
        "City": "New York",
        "State": "NY",
        "Zip": "10000",
        "AddressClassification": null
    }
};
data = JSON.stringify(data);

上面的第一步使用Javascript对象文字符号创建一个对象,它是JSON的超集(如上所述,它实际上与JSON相同,但忽略它)。第二个位接受该对象并将其转换为字符串。

当然,上面的值是文字字符串,这是不太可能的。如果您在变量中包含每个值,那么这就是它的样子:

var data = {
    "Address": {
        "Address1": address1,
        "Address2": address2,
        "City": city,
        "State": state,
        "Zip": zip,
        "AddressClassification": null
    }
};
data = JSON.stringify(data);

无论哪种方式,现在你都有了字符串。

将JSON字符串发送到Web服务

您需要了解Web服务是否期望JSON格式的数据 POST主体,或者它是否期望JSON数据是更多参数的值common name = value URL编码的POST数据。我倾向于期望前者,因为Web服务似乎专门设计用于处理JSON格式的数据。

如果它应该 POST主体,那么,我从来没有用jQuery做过,而你所引用的内容看起来对我来说正确阅读文档。如果它不起作用,我会仔细检查你的对象结构是否真的是他们期望看到的。例如,如果它只是验证一个地址,我想知道它是否期望接收只是一个Address对象,而不是一个包含Address对象的对象,例如:

{
    "Address1": "123 Main Street",
    "Address2": null,
    "City": "New York",
    "State": "NY",
    "Zip": "10000",
    "AddressClassification": null
}

如果它应该是无聊的旧URL编码的多部分表单数据中的参数值,那么:

$.ajax({
    type: "POST",
    url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
    data: "paramname=" + encodeURIComponent(data),
    dataType: "json",
    success: function(response){
        alert(response);
    }
})

我删除了contentType,因此jQuery将回退到默认值(“application / x-www-form-urlencoded”)并确保我们在上面创建的字符串在该内容类型中正确编码。您需要找出要使用的paramname(可能是“地址”并查看我之前关于仅发送地址的注释,而不是包含地址子对象的对象?)。

答案 2 :(得分:1)

JSON.stringify将获取一个javascript对象并将其转换为字符串。我打赌,如果你创建一个像

这样的Javascript对象
var jsonData = {
    address: 'address',
    address1: 'address1',
    address2: 'address2'
};

然后将jsonData作为'data'传递给ajax调用,然后它会将对象转换为json文本。

答案 3 :(得分:1)

我会创建一个javascript对象,然后调用JSON.stringify将其转换为有效的JSON。您可以从here下载。

你可以这样做:

var address= {};

address["Address1"] = "your val";
address["Address2"] = "your val";
address["City"] = "your val";
address["State"] = "your val";
address["Zip"] = "your val";

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
    data: JSON.stringify(address),
    dataType: "json",
    success: function(response){
        alert(response);
    }
});

答案 4 :(得分:1)

你需要像这样传递:

$.ajax({
  type: "POST",
  url: "WebService.asmx/WebMethodName",
  data: "{'fname':'dave', 'lname':'ward'}",
  contentType: "application/json; charset=utf-8",
  dataType: "json"
});

有关详细信息,请查看此文章:3 mistakes to avoid when using jQuery with ASP.NET AJAX

答案 5 :(得分:1)

如果这个答案来得太晚,或者是重复,那么道歉。

据我所知,看起来好像你只想发送一个JSON对象的字符串。尝试构建一个对象,然后使用它的属性并按原样发送它。

示例:

address = new Object();
address.Address = new Object();
address.Address.Address1 = "123 Main Street";
address.Address.Address2 = "";
address.Address.City = "New York";
address.Address.State = "NY";
address.Address.Zip = "10000";
address.Address.AddressClassification = null;
$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
    data: address,
    dataType: "json",
    success: function(response){
        alert(response);
    }
});

答案 6 :(得分:0)

获取一个可以将任何javascript对象转换为json的jquery插件。例如:

http://plugins.jquery.com/project/json