Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET WebMethod Returns JSON wrapped in quotes

Tags:

json

asp.net

asmx

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.

like image 373
Mark Clancy Avatar asked Jun 08 '10 14:06

Mark Clancy


2 Answers

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

like image 162
Chris Fewtrell Avatar answered Oct 17 '22 18:10

Chris Fewtrell


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/

like image 22
rainabba Avatar answered Oct 17 '22 18:10

rainabba