【问题标题】:ASP.NET WebMethod - Disabling serialization of return value to JSONASP.NET WebMethod - 禁用将返回值序列化为 JSON
【发布时间】:2011-11-04 23:31:42
【问题描述】:

我正在使用 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"} 这很好,但由于返回类型设置为“字符串”,整个存储的 json 将在“和其他转义字符之前用 '\' 字符跳过,因此我不能使用它作为客户端的 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);
            }});

但它会引发错误。

知道如何解决这个问题吗?

【问题讨论】:

  • 为什么要返回字符串而不是匿名对象?
  • 由于我使用服务器端只是为了保存 JSON 对象,我不想(或不需要)将它反序列化为 .NET 对象,这将产生不必要的开销。 .
  • 我会说你可能不应该首先将你的数据作为 JSON 存储在数据库中,但如果这不是一个选项,那么我同意反序列化它只是为了再次序列化将是一个有点傻。我不知道有什么方法可以让 web 方法按原样返回给定的字符串。

标签: jquery asp.net json webmethod


【解决方案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() 方法。

【讨论】:

  • 你的建议很有效!您能否详细说明一下我使用“eval”的问题是什么?为什么您的解决方案有效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多