我如何构build一个JSON对象发送到AJAX WebService?

在尝试用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:指定的所有东西,这是我的问题所在。 我如何build立一个格式正确的JSON对象在JavaScript中,所以我可以插入到我的ajax调用像这样:

 data: theRequest 

我将最终从表单中的文本input中提取数据,但是现在硬编码的testing数据没有问题。

如何构build一个格式正确的JSON对象发送到Web服务?


更新:事实certificate,我的请求问题不是格式的JSON,正如TJ指出的,而是我的JSON文本不符合Web服务的要求。 以下是基于WebMethod中代码的有效JSON请求:

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

这引出了另一个问题: 在ASP.NET Web服务(ASMX)的JSON请求中,何时区分大小写?

答案是非常简单的,基于我以前的post如果ContentType不是JSON ,我可以从.asmx Web服务返回JSON吗? 和jQuery ajax调用httpget webmethod(c#)不起作用 。

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

首先将数据构build为原生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) 

ajax调用的data参数的值应该是这样的

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

要么

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

如果你更喜欢另一个版本的JSON编码器。

你的问题分解成两部分:

创buildJSONstring

你的引用代码中的JSON是完全有效的。 但手工制作是一种痛苦。 正如其他人所说,最简单的方法是创build一个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对象文字符号创build一个对象,它是JSON的超集(如上所述,它实际上与JSON相同,但是忽略)。 第二个位接受该对象并将其转换为string。

当然,上面的值是string,这是不太可能的。 如果你在一个variables中使用了每个值,这就是它的样子:

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

无论哪种方式,现在你有string。

将JSONstring发送到Web服务

您需要了解Web服务是否期望JSON格式的数据 POST主体,还是期望JSON数据是更常用的名称=值URL编码的POST数据中的参数的值。 我倾向于期望前者,因为Web服务似乎专门devise用于使用JSON格式的数据。

如果它应该 POST机构,那么我从来没有用jQuery来做这件事,而且你所引用的内容对我来说是正确的。 如果它不工作,我会仔细检查你的对象结构是否真的是他们期望看到的。 例如,如果它只是validation一个地址,我想知道是否期望只接收一个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”),并确保我们上面创build的string在该内容types中正确编码。 你需要找出使用的参数名(也许是“地址”,看到我刚刚发送的只是发送地址的意见,而不是包含地址子对象的对象?)。

JSON.stringify将采取一个JavaScript对象,并把它变成一个string。 我敢打赌,如果你创build一个Javascript对象

 var jsonData = { address: 'address', address1: 'address1', address2: 'address2' }; 

然后在ajax调用中将jsonData作为“data”传入,然后将该对象转换为json文本。

我会创build一个JavaScript对象,然后调用JSON.stringify把它变成有效的JSON。 你可以从这里下载。

你可以做这样的事情:

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

你需要像这样传递它:

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

看看这篇文章的更多细节: 避免在ASP.NET AJAX中使用jQuery时出现3个错误

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

从我所了解的情况来看,好像你只是发送一个JSON对象的string。 尝试构build一个对象,然后使用它的属性并按原样发送它。

例:

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

得到一个jQuery的插件,可以将任何JavaScript对象转换为json。 例如:

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