【问题标题】:ASP.NET WebMethod Returns JSON wrapped in quotesASP.NET WebMethod 返回用引号括起来的 JSON
【发布时间】:2011-03-01 05:15:28
【问题描述】:

我有一个带有 WebMethod 的 asp.net 页面,用于将 JSON 传递回我的 javascript。

下面是web方法:

[WebMethod]
public static string getData(Dictionary<string, string> d) {

    string response = "{ \"firstname\": \"John\", \"lastname\": \"Smith\" }";

    return response;

}

当它返回给客户端时,它的格式如下:

{ \"d\": \"{ \"firstname\": \"John\", \"lastname\": \"Smith\" }\" }

问题是双引号将所有内容都包含在“d”下。我在 web 方法或其他不带引号的情况下返回数据的方法中是否遗漏了什么?我真的不想每次都在客户端上剥离它。此外,我还看到其他没有发生这种情况的文章。

任何帮助将不胜感激。

【问题讨论】:

    标签: asp.net json asmx


    【解决方案1】:

    我的代码也有类似的问题。我试图将 XmlDocument 作为 JSON 返回到调用脚本,但从 WebService 返回 XmlDocument 返回了一组空数组(因为 XmlDocument 不可序列化!)。

    如果我使用属性 ResponseFormat.JSON 设置 ScriptService,那么我的 JSON 被双重转义。

    战胜 ASP.NET 的方法是告诉 ASP.NET 你正在返回 XML,然后它就不会双重转义你的 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;
        }
    

    我知道这是一个黑客,但是.....

    【讨论】:

      【解决方案2】:

      实际上,这整个问题的存在是因为您试图超越 ASP.Net Web 服务。您需要为要返回的数据设置一个类,并使用该类(或 List(of YourClass))对结果进行排队并返回。

      解释所有这一切的好文章(一个非常常见的陷阱)是:http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

      【讨论】:

        【解决方案3】:

        我假设你想返回对象的 JSON 表示

         {
            firstname:"John",
            lastname:"Smith"
         }
        

        但是您的方法签名正在返回一个字符串。 ASP.Net 框架序列化正确序列化字符串response。换句话说,如果你的函数是

        string response = "foo";
        return response; 
        

        如果输出是这样的,你不会感到惊讶

        {"d":{"foo"}}
        

        恰好response 有双引号需要转义。

        你显然只是想接近对象。你有两个选择:-

        1) 在您的 javascript 中使用 eval 将字符串转换为对象,例如

        function onSuccessCallback(retval) {
             var obj = eval(retval.d);
        }`
        

        2) 或(这是我的首选解决方案)让您的方法返回一个实际对象,并让框架的 JSON 序列化为您完成繁重的工作

        [WebMethod]
        public static object getData(Dictionary<string, string> d) {
            var response = new { firstname = "John", lastname="Smith" };
            return response;
        }
        

        您会看到这会产生您可能最初预期的响应(例如 {"d":{"firstname":"John", "lastname":"Smith"}}

        【讨论】:

        • 附言。如果你想让你的函数返回一个包含 JSON 的字符串,那么我建议使用类似 Risk Strahl 的 ToJson 扩展函数 [west-wind.com/weblog/posts/442969.aspx]。然后,您的方法主体可以是 new {firstname="John"}.ToJson()。
        • 感谢您的回复,这很有趣。我没有意识到您可以在 c# 中以这种方式创建对象。但是,我已经创建了一个从对象构建 json 字符串的框架,因此必须使用客户端选项。我将在未来的项目中研究服务器端选项。谢谢。
        • @ChrisFewtrell - 非常感谢。我已经返回 STRING 快 2 年了。这个帖子/答案应该被评为更高
        猜你喜欢
        • 1970-01-01
        • 2019-10-26
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-26
        • 1970-01-01
        相关资源
        最近更新 更多