2010-06-08 89 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 .....