2013-02-19 211 views
0

我的服務方法:Asmx web服務如何返回JSON而不是XML?

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string getDataFromTrainingMaster() 
{ 
    List<TrainingMasterDataStruct> results = new DAL().GetDataFromTrainingMaster(); 
    JavaScriptSerializer js = new JavaScriptSerializer();      
    return js.Serialize(results).ToString(); 
} 

我的.NET Web服務返回JSON包裹在XML如下:

<?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}] 

我需要它的格式如下:

"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> 

哪有我這樣做?

+0

你使用什麼樣的技術來創建Web服務? ASP.NET Web API?靜態頁面方法? WCF? – Snixtor 2013-02-19 05:45:34

+0

它的ASP.Net VS2008。 – bapi 2013-02-19 05:57:55

+0

感謝您通過添加您的服務器端代碼來澄清,我看到您正在使用'WebMethod'屬性。這是許多不同的Web服務框架中的一個,因此在提出問題時一定要提及。看起來像在這裏討論(和回答)相同的問題 - http://stackoverflow.com/questions/5611134/responseformat-json-returns-xml – Snixtor 2013-02-19 08:24:12

回答

0

嘗試將您的退貨類型更改爲List<TrainingMasterDataStruct>並返回「results」。你不需要自己對字符串進行序列化,具有WebMethod屬性的ASP.NET將爲你處理。

0

你可以試試這個:

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

result會給你所需的輸出。

+0

從哪個命名空間「JSON」belogs.Now獲取錯誤,「JSON」不在當前上下文。 – bapi 2013-02-19 09:52:17

+0

其實json.stringify是一個javascript函數,所以你可以嘗試使用ajax來調用你的web服務在客戶端並使用this.May是這將工作。 – Ni3 2013-02-19 10:34:35

+0

JSON.stringify並非內置於所有瀏覽器。使用json2.js。 https://github.com/douglascrockford/JSON-js – 2013-05-29 13:44:21

1

沒有必要自己創建JSON字符串。返回List<TrainingMasterDataStruct>,讓.NET連載它爲你快速:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public List<TrainingMasterDataStruct> getDataFromTrainingMaster() 
{ 
    List<TrainingMasterDataStruct> list = doStuff(); 
    return list; 
} 

其次,非靜態方法的簽名表明這是一個ASMX文件(第方法是靜態的)。默認情況下,這些序列化到xml的,所以你將必須解除或System.Web.Script.Services.ScriptService屬性添加到Web服務類:

[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更多的類型,因此如果要輸出或/或 - 在此處使用列表和數組而不是集合,請注意這一點。

第三個和非常重要的是,CLIENT必須向服務器指出它需要JSON響應。

爲了測試和驗證第三點,我建議您按照上述步驟,然後使用jQuery從測試網頁調用Web服務,並監視Fiddler中的流量。喜歡的東西:

$.ajax({ 
     type: "POST", 
     url: "WebService.asmx/getDataFromTrainingMaster", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     data: "", 
     success: function (msg) { } 
    }); 

這是一個JSON請求/響應的樣子 - 特別關注到了後,接受和Content-Type頭:

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": 
相關問題