ASP.NET WebMethod - 禁用将返回值序列化为JSON

时间:2011-11-04 23:31:42

标签: jquery asp.net json webmethod

我正在使用JQuery和WebMethod在我的数据库中发送和存储JSON对象的字符串表示。

以同样的方式,我有另一个WebMethod应该从数据库中取回用户设置并将其返回给请求客户端:

[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;
}

一切顺利,但问题是当我“嗅”http响应时,响应就像这样包装:

{"d":"my_stored_json_object_as_an_escaped_string"}这很好,但由于返回类型设置为“string”,所以在“和其他转义字符之前,用”\“字符跳过整个存储的json,因此我可以' t在客户端使用它作为javascript对象。

我尝试过这样的事情:

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

但它会引发错误。

任何想法如何克服这个问题?

1 个答案:

答案 0 :(得分:1)

我怀疑问题是eval()将您的JSON视为范围声明而不是哈希对象。解决这个问题的简单方法就是这个

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

虽然我仍然宁愿将你的返回值从web方法修改为实际的JSON。

如果没有,则发布您的实际回复,以便更容易理解发生了什么。

编辑:

就像我说的那样,eval()对你给它的字符串的性质感到困惑。它看到{并认为它是一个范围大括号,然后尝试将其余部分作为单独的语句进行评估,这当然是无效的。基本上它需要一些帮助来理解你给它的字符串是一个哈希对象。你可以通过在大括号中包装来创建所谓的填充JSON,如上所示。 或者您可以将其重写为eval('obj = ('+usrSettingsObj.d+')');,这应该具有相同的效果。实际上在最后一种情况下你甚至不需要牙箍。只需eval('obj = '+usrSettingsObj.d);即可。

哦,最重要的是:使用eval()来解析JSON通常是不受欢迎的。您应该尽可能使用实际的JSON解析器。我相信jQuery有parseJSON()方法。