ASP.NET WebMethod返回包含在引号中的JSON

时间:2010-06-08 14:51:11

标签: asp.net json asmx

我有一个带有WebMethod的asp.net页面,可以将JSON传递给我的javascript。

Bellow是网络方法:

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

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

    return response;

}

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

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

问题是在“d”下包装所有内容的双引号。有没有我在网络方法中遗漏的东西或其他一些没有引号的数据返回方法?我真的不想每次都在客户端剥离它。我也见过其他文章,但这不会发生。

感谢任何帮助。

3 个答案:

答案 0 :(得分:8)

我假设你想要返回对象的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"}}

答案 1 :(得分:3)

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

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

答案 2 :(得分:-1)

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

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

out-fox 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;
    }

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