ASP.NET WebMethod Returns JSON wrapped in quotes

前端 未结 3 1425
挽巷
挽巷 2020-12-15 00:53

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         


        
相关标签:
3条回答
  • 2020-12-15 01:33

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

    0 讨论(0)
  • 2020-12-15 01:36

    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/

    0 讨论(0)
  • 2020-12-15 01:44

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

    0 讨论(0)
提交回复
热议问题