ASP.NET WebMethod Returns JSON wrapped in quotes

I have an asp.net page with a WebMethod on it to pass JSON back to my javascript.

Bellow is the web method:

[WebMethod]
public static string getData(Dictionary<string, string> d) {

    string response = "{ "firstname": "John", "lastname": "Smith" }";

    return response;

}

When this is returned to the client it is formatted as follows:

{ "d": "{ "firstname": "John", "lastname": "Smith" }" }

The problem is the double quotes wrapping everything under ‘d’. Is there something I’ve missed in the web method or some other means of returning the data without the quotes? I don’t really want to be stripping it out on the client everytime. Also I’ve seen other articles where this doesn’t happen.

Any help would be appreciated thanks.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

I assume that you want to return the JSON representation of the object

 {
    firstname:"John",
    lastname:"Smith"
 }

but your method signature is returning a string. The ASP.Net framework serialisation is correctly serialising the string response. Put another way, if your function was

string response = "foo";
return response;

You would not be surprised if the output was

{"d":{"foo"}}

It just happens that response has double quotes that need to be escaped.

You obviously just want to get at the object. You have 2 options: –

1) use eval in your javascript to turn the string into an object e.g.

function onSuccessCallback(retval) {
     var obj = eval(retval.d);
}`

2) or (and this is my prefered solution) have your method return an actual object and let the JSON serialisationof the framework do the heavy lifting for you

[WebMethod]
public static object getData(Dictionary<string, string> d) {
    var response = new { firstname = "John", lastname="Smith" };
    return response;
}

You will see that this generates the response that you probably originally expected (e.g.
{"d":{"firstname":"John", "lastname":"Smith"}}

Method 2

Actually this entire issue exists because you’re trying to out-think ASP.Net web services. You need to setup a class for your data to be returned and use that class (or List(of YourClass)) to queue up results and return them.

A great article explaining all this (a very common pitfall) is: http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

Method 3

I had a similar issue with my code. I was trying to return an XmlDocument as JSON to a calling script but returning XmlDocument from the WebService returned an empty set of arrays (as XmlDocument is NOT serializable!).

If i set the ScriptService with the attribute ResponseFormat.JSON then my JSON was double-escaped.

The way to out-fox ASP.NET is to tell ASP.NET that you’re returning XML and then it won’t double-escape your JSON 😉

    [WebMethod(EnableSession = true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
    public String MyJSONWebService(String sParam1, String sParam2, String sParam3)
    {
       ... do stuff.....
       XmlDocument oXMLDocument = new XmlDocument();
       oXMLDocument.LoadXml(sXML);
       sJSON = JsonConvert.SerializeXmlNode(oXMLDocument.SelectSingleNode("autnresponse"));
       return sJSON;
    }

I know it’s a hack but …..


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x