Asmx web service how to return JSON and not XML?
我的服务方式:
1 2 3 4 5 6 7 8 |
我的.net Web服务返回以XML包装的JSON,如下所示:
1 2 | <?xml version="1.0" encoding="UTF-8"?> <string xmlns="http://tempuri.org/"> [{"Training_Code":"1234","Training_Duration":"2hrs","Training_Startdate":"2/14/2013 3:00:00 PM","Training_Enddate":"2/14/2013 5:00:00 PM","Trainer_ID":1,"Training_Location":"B-Wing Training room-4","Comments":"C# training","Keyword":"C#1234","NumberofDays":1},{"Training_Code":"4321","Training_Duration":"16","Training_Startdate":"2/17/2013 10:30:00 AM","Training_Enddate":"2/17/2013 5:30:00 PM","Trainer_ID":2,"Training_Location":"A-Wing Training Room-6","Comments":"Objective-C","Keyword":"Obj-C4321","NumberofDays":2}] |
我需要以下格式:
1 | "Training":[{"Training_Code":"1234","Training_Duration":"2hrs","Training_Startdate":"2/14/2013 3:00:00 PM","Training_Enddate":"2/14/2013 5:00:00 PM","Trainer_ID":1,"Training_Location":"B-Wing Training room-4","Comments":"C# training","Keyword":"C#1234","NumberofDays":1},{"Training_Code":"4321","Training_Duration":"16","Training_Startdate":"2/17/2013 10:30:00 AM","Training_Enddate":"2/17/2013 5:30:00 PM","Trainer_ID":2,"Training_Location":"A-Wing Training Room-6","Comments":"Objective-C","Keyword":"Obj-C4321","NumberofDays":2}]</string> |
我怎样才能做到这一点?
无需自己创建JSON字符串。返回
1 2 3 4 5 6 7 | [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public List<TrainingMasterDataStruct> getDataFromTrainingMaster() { List<TrainingMasterDataStruct> list = doStuff(); return list; } |
其次,非静态方法签名表明这是一个asmx文件(页面方法是静态的)。默认情况下,这些序列化为xml,因此您需要取消注释或将
1 2 3 4 | [WebService(Namespace ="http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class WebService : System.Web.Services.WebService { |
这使它可以返回JSON。一个问题:JSON序列化程序似乎可以比XML序列化更多的类型,因此如果要输出一个或多个,请在此处注意-在此处使用列表和数组而不是集合。
第三,也是非常重要的一点,客户端必须向服务器指示它需要JSON响应。
为了测试和验证这第三点,我建议您按照上述步骤操作,然后使用jQuery从测试网页中调用Web服务并监视Fiddler中的流量。就像是:
1 2 3 4 5 6 7 8 | $.ajax({ type:"POST", url:"WebService.asmx/getDataFromTrainingMaster", contentType:"application/json; charset=utf-8", dataType:"json", data:"", success: function (msg) { } }); |
这是JSON请求/响应的样子-特别注意POST,Accept和Content-Type标头:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | POST http://scrubbed/GetVehicles HTTP/1.1 x-requested-with: XMLHttpRequest Accept-Language: en-gb Accept: application/json, text/javascript, */* Content-Type: application/json; charset=utf-8 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.2) Host: scrubbed Content-Length: 0 Connection: Keep-Alive Pragma: no-cache HTTP/1.1 200 OK Cache-Control: private, max-age=0 Content-Type: application/json; charset=utf-8 Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Date: Mon, 04 Oct 2010 10:49:12 GMT Content-Length: 1417 {"d":{"Data":[{"Key":1,"Value":[{"VehicleId":15036,"VehicleAlias":"Whatever","Expiry":"\/Date(1915983035043)\/","Expired":false},{"VehicleId": |
您可以尝试以下方法:
1 2 3 | var data = [{"Training_Code":"1234","Training_Duration":"2hrs","Training_Startdate":"2/14/2013 3:00:00 PM","Training_Enddate":"2/14/2013 5:00:00 PM","Trainer_ID":1,"Training_Location":"B-Wing Training room-4","Comments":"C# training","Keyword":"C#1234","NumberofDays":1},{"Training_Code":"4321","Training_Duration":"16","Training_Startdate":"2/17/2013 10:30:00 AM","Training_Enddate":"2/17/2013 5:30:00 PM","Trainer_ID":2,"Training_Location":"A-Wing Training Room-6","Comments":"Objective-C","Keyword":"Obj-C4321","NumberofDays":2}] var result = JSON.stringify({ Training: data }) |
尝试将返回类型更改为