在尝试使用javascript手动格式化JSON数据并失败后,我意识到可能有更好的方法。这是Web服务方法和相关类的代码在C#中的样子:
[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函数:
getJSON
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:
data: theRequest
我最终将以表格形式从文本输入中提取数据,但现在硬编码的测试数据还可以。
如何构建格式正确的JSON对象以发送到Web服务?
更新:事实证明,我的请求的问题不是TJ指出的JSON格式,而是我的JSON文本不符合Web服务的要求。 这是一个基于WebMethod中代码的有效JSON请求:
'{"request":{"Address":{"Address1":"123 Main Street","Address2":"suite 20","City":"New York","State":"NY","Zip":"10000","AddressClassification":null}}}'
数据应使用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)}
{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); } })
您可以使用http://www.json.org/中的另一个版本(JSON.stringify),而不是来自JSON插件的$.toJSON
如果您的WebMethod具有如下参数
public Response ValidateAddress(Request request1, Request myRequest2)
调用data参数的值ajax应类似于
data
data: {request1:$.toJSON(myData1), myRequest2:$.toJSON(myData2)}
要么
data: {request1:JSON.stringify(myData1), myRequest2:JSON.stringify(myData2)}
如果您喜欢其他版本的JSON编码器。