Serviço web Asmx como retornar JSON e não XML?

Meu método de serviço:

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

Meu serviço da web .net retorna JSON envolto em XML da seguinte forma:

   [{"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}] 

Eu preciso disso no seguinte formato:

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

Como posso fazer isso?

Não há necessidade de criar a string JSON você mesmo. Retorne a List e deixe o .net serializá-lo para você na hora:

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

Em segundo lugar, as assinaturas de methods não estáticos sugerem que este é um arquivo asmx (os methods de página são estáticos). Por padrão, esses serializar para xml, portanto, você precisará remover o comentário ou adicionar o atributo System.Web.Script.Services.ScriptService à class de serviço da Web:

 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class WebService : System.Web.Services.WebService { 

Isso permite que ele retorne JSON. Um problema: O serializador JSON parece ser capaz de serializar mais tipos do que XML, então seja cuidadoso aqui se você quiser produzir / ou – usar listas e matrizes aqui em vez de collections.

Em terceiro lugar e muito importante , o CLIENTE deve indicar ao servidor que deseja uma resposta JSON.

Para testar e verificar esse terceiro ponto, sugiro que você siga as etapas acima e, em seguida, faça uma chamada para o serviço da Web a partir de uma página da Web de teste usando jQuery e monitore o tráfego no Fiddler . Algo como:

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

É assim que uma solicitação / resposta JSON se parece – preste atenção nos headers POST, Accept e 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": 

Tente alterar seu tipo de retorno para List e retornando ” results “. Você não precisa serializar a string você mesmo, o ASP.NET com o atributo WebMethod cuidará disso para você.

Você pode tentar isto:

 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 lhe dará a saída desejada.