Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET JSON web service always return the JSON response wrapped in XML

Tags:

json

xml

asmx

I saw a similar question but it did not resolve my issue. I have a JSON web service in an ASMX file;

The code for the web method

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetUserRoles(string JSONUserCode)
        {
            string retRoles = string.Empty;
            List<JSONRole> roles = new List<JSONRole>();

            {... I Populate the roles here ...}

            DataContractJsonSerializer serializer = new
            DataContractJsonSerializer(roles.GetType());
            MemoryStream ms = new MemoryStream();
            serializer.WriteObject(ms, roles);
            string jsonString = Encoding.Default.GetString(ms.ToArray());
            ms.Close();
            return jsonString;
        }

This correctly formats the List correctly but wraps the entire return in XML. Here is the response:

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://formshare.com/">
       [{"Name":"Accounts Payable"},{"Name":"Payroll"}]
    </string>

You can view the Response your self by clicking this link:

http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles?JSONUserCode=1234

I need the response to be just:

[{"Name":"Accounts Payable"},{"Name":"Payroll"}]

Any ideas? Thanks for your help.

like image 414
JohnnyCantCode Avatar asked Jul 13 '09 19:07

JohnnyCantCode


1 Answers

The WebMethod is able to serve the same information both as XML and JSON. You need to specify what format you want (dataType) in the client, as you submit your request.

Also, you're not supposed to serialize the object to JSON manually, but rather, return roles, and it will be serialized to JSON if your client requests the data as JSON.

EDIT

jQuery example (note the dataType parameter):

$.ajax({
   type: 'GET',
   url: 'http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles',
   contentType: 'application/json; charset=utf-8',
   dataType: 'json',
   data: '{"JSONUserCode":"1234"}',
   success: myCallback
});

It is worth mentioning that the object will not be returned in exactly the format you specified, but rather, wrapped in an object:

{ d: [ {"Name":"Accounts Payable"}, {"Name":"Payroll"} ] }

This, however, is actually quite desirable, for added security

like image 103
David Hedlund Avatar answered Oct 18 '22 07:10

David Hedlund