Search code examples
jqueryasp.netjsonwebmethod

ASP.NET WebMethod - Disabling serialization of return value to JSON


I'm using JQuery and a WebMethod to send and store the string representation of a JSON object inside my database.

In the same manner, I have another WebMethod which is supposed to fetch the user settings back from the database and return it to the requesting client:

[WebMethod]
public static string GetUserSettings()
{
    FacebookWebContext currentFbContext = FacebookWebContext.Current;

    string encodedSettings = "{}";

    if (currentFbContext.IsAuthorized(ExtendedPermissions))
    {
        // Methods to fetch json back from the database into "encodedSettings"
    }

    return encodedSettings;
}

Everything goes well, but the problem is that when I "sniff" the http response, the response is wrapped like this:

{"d":"my_stored_json_object_as_an_escaped_string"} which would be just fine, but since the return type was set to "string", the entire stored json is skipped with '\' characters before "'s and other escape characters, therefore I can't use it as a javascript object on the client side.

I tried using something like this:

        $.ajax({
            type: "POST",
            url: "Ajax/Default.aspx/GetUserSettings",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (usrSettingsObj) {
                var obj = eval(usrSettingsObj.d);
            }});

But it throws an error.

any idea how can I overcome this problem?


Solution

  • I suspect the issue is that eval() is treating your JSON as a scope declaration instead of a hash object. Easy way to get around this is this

    var obj = eval('('+usrSettingsObj.d+')');

    Though I would still rather fix your return value from the web method to be actual JSON.

    If not, then post your actual response, so it is easier to understand what is going on.

    edit:

    Like I said, eval() is confused about nature of the string you gave it. It sees { and thinks it is a scope opening brace, and then tries to evaluate the rest of it as individual statements, which are of course invalid. Basically it needs a bit of help to understand that the string you gave it is a hash object. You can do it by wrapping in braces to create so called padded JSON like I've shown above. Or you can rewrite that as eval('obj = ('+usrSettingsObj.d+')');, which should have the same effect. Actually in this last case you don't even need braces. Just eval('obj = '+usrSettingsObj.d); should work.

    Oh, and the most important thing: Using eval() to parse JSON is generally frowned upon. You should use actual JSON parser whenever you can. I believe jQuery has parseJSON() method.