2010-06-08 47 views
7

我有一个asp.net页面上有一个WebMethod来传递JSON到我的javascript。ASP.NET WebMethod返回JSON包裹在引号

贝娄是Web方法:

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

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

    return response; 

} 

当这个被返回到它的格式如下客户端:

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

的问题是双引号包裹在“d”的一切。有没有我在网络方法中遗漏的东西或其他一些不带引号的数据返回方式?我真的不想每次都在客户端上剔除它。另外我还看过其他文章,这没有发生。

任何帮助,将不胜感激谢谢。

回答

8

我假设你想返回对象

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

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

string response = "foo"; 
return response; 

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

{"d":{"foo"}} 

它只是碰巧response有需要转义双引号。

你显然只是想找到对象。您有2个选项: -

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

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

2)或(这是我的首选解决方案)有你的方法返回一个实际的对象,并让JSON serialisationof的框架做繁重你

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

你会看到,这生成,你可能原先预期的响应(例如 {"d":{"firstname":"John", "lastname":"Smith"}}

+1

PS。如果你想让函数返回一个包含JSON的字符串,那么我建议使用Risk Strahl的ToJson扩展函数[http://www.west-wind.com/weblog/posts/442969.aspx]。你的方法体可以是new {firstname =“John”}。ToJson()。 – 2010-06-08 21:17:38

+0

感谢您的回应,这非常有趣。我没有意识到你可以在c#中创建对象。不过,我已经创建了一个框架,用于从对象构建JSON字符串,因此必须使用客户端选项。我将在未来的项目中研究服务器端选项。谢谢。 – markvpc 2010-06-09 09:42:42

-1

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

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

ASP.NET的出路是告诉ASP。你正在返回的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; 
    } 

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