Asmx web service how to return JSON and not XML?
Asked Answered
B

5

3

My service method:

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

My .net web service returns JSON wrapped in XML as follows:

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

I need it in the following format:

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

How can I do this?

Bertle answered 19/2, 2013 at 5:37 Comment(2)
What technology have you used to create the web service? ASP.NET Web API? Static page method? WCF?Resonate
Thanks for clarifying by adding your server-side code, I see you're using WebMethod attribute. This is one of many different web service frameworks, so be sure to mention that when raising a question. Looks like the same issue discussed (and answered) here - #5611634Resonate
I
2

There's no need to create the JSON string yourself. Return the List<TrainingMasterDataStruct> and let .NET serialise it for you on the fly:

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

Secondly, the non-static method signatures suggest this is an asmx file (page methods are static). By default these serialise to xml so you will need to uncomment or add the System.Web.Script.Services.ScriptService attribute to the web service class:

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

This allows it to return JSON. One issue: The JSON serialiser seems to be able to serialise more types than XML so be careful here if you want to output either/or - use Lists and arrays here rather than collections.

Thirdly and very importantly, the CLIENT must indicate to the server that it desires a JSON response.

To test and verify this third point, I suggest you follow the above steps and then make a call to the web service from a test web page using jQuery and monitor the traffic in Fiddler. Something like:

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

This is what a JSON request/response looks like - pay particular attention to the POST, Accept and Content-Type headers:

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":
Improvement answered 2/5, 2013 at 9:49 Comment(0)
T
0

Try changing your return type to List<TrainingMasterDataStruct> and returning "results". You don't need to serialize the string yourself, ASP.NET with the WebMethod attribute will take care of that for you.

Tache answered 19/2, 2013 at 6:11 Comment(0)
B
0

You can try this:

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 will give you the desired output.

Brier answered 19/2, 2013 at 8:0 Comment(3)
from which namespace "JSON" belogs.Now getting error, "JSON" is not in current context.Bertle
Actually json.stringify is a javascript function so you can try using ajax to call your web service on client side and use this.May be this will work.Brier
JSON.stringify is not built in to all browsers. Use json2.js. github.com/douglascrockford/JSON-jsImprovement
S
0

I had a similar error. One method returns the response in correct json format but another method returns xml in the same asmx.

Here the two methods:

Response in JSON format:

[WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string loginOne(string param1, string param2){
          result = new JObject();
          ...
          ...
          return result.ToString();
    }

Response in XML format:

 [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string getCompaniesOne()
    {
        ...
        ...
        return result.ToString();
    }

How I solved?

Adding a dummy parameter to the wrong response method.

 [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string getCompaniesOne(string dummy)
    {
       ...
       ...
       return result.ToString();
    }       

I Hope this help.

Suppositive answered 9/10, 2019 at 14:40 Comment(0)
O
0

The problem can be circumvented in the following way.

This asmx service will return the JSON value: {"d":"Hello World"}

<%@ WebService Language="C#" CodeBehind="Data.asmx.cs" Class="WebServiceData" %>

using System.Web;
using System.Web.Services;
using System.Web.Script.Services;

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class WebServiceData : WebService
{
    [WebMethod(EnableSession = true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void Get()
    {
        object ret = new {
            d = "Hello World"
        };

        string retjson = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ret);
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.ContentType = "application/json; charset=utf-8";
        HttpContext.Current.Response.AddHeader("content-length", retjson.Length.ToString());
        HttpContext.Current.Response.Write(retjson);
        HttpContext.Current.Response.Flush();
    }
}
Odey answered 29/3, 2022 at 8:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.