ASP.NET WebMethod Returns JSON wrapped in quotes

2019-01-22 23:32发布

问题:

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.

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



回答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/



回答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 .....