2014-12-05 90 views
4

任何人都可以向我解釋ASP.NET如何處理從類對象到WebMethods中的JSON對象的轉換?WebMethod自動將類對象作爲JSON返回

例如,你有以下的WebMethod返回一個Person對象:

[WebMethod] 
    public static Person GetPerson() 
    { 
     Person p = new Person() 
     { 
      Id = 1, 
      Name = "Test" 
     }; 

     return p; 
    } 

在我的jQuery在那裏我打電話的WebMethod,我得到它包含了一個JSON對象的響應。

ASP.NET如何自動執行此操作?它是否使用JavaScriptSerializer課程?

此外,您還看到很多使用JSON轉換器將您的類對象轉換爲json對象的示例。爲什麼是這樣?是因爲它使用的JavaScriptSerializer類,它的糟糕表現還是...?

+1

附註:'WebMethod'不再被支持。如果您需要基於JSON或XML的API,最好查看[ASP.NET Web API](http://www.asp.net/web-api),它使用Newtonsoft的Json.NET來處理JSON序列化。 – mason 2014-12-05 13:35:30

+0

我正在使用ASP.NET Webforms,我有一些Ajax調用,我可以在我的webforms項目中使用Web API嗎? – Mivaweb 2014-12-05 13:39:46

+0

是的!你當然可以。微軟有這個倡議稱爲[One ASP.NET](http://channel9.msdn.com/Events/Visual-Studio/Launch-2013/WC103)。基本上所有的服務都應該得到相同的功能(如果適用),你可以混合和匹配你的項目。實際上,我開始使用Web窗體的Web API,但現在我正在學習MVC。它基本上就像添加一個NuGet包一樣簡單,配置一些路由,然後你幾乎可以將你的Web方法代碼複製到Web API函數中。請參閱我的第一個評論中的鏈接,瞭解入門步驟。 – mason 2014-12-05 13:42:26

回答

3

ASP.NET如何自動執行此操作?

基本上有一些代碼的網頁,並且接受請求將WebMethod之間坐着,計算出它的要求是什麼,找到你的WebMethod和取得的成績,再序列回基於可接受的格式客戶端請求標頭。

它使用JavaScriptSerializer類嗎?

也許。我沒有找到任何說明它的地方。但它不使用任何第三方庫。由於這是一個內置的,這是一個很好的假設。

此外,您還看到很多使用JSON轉換器將 類對象轉換爲json對象的示例。爲什麼是這樣?是否因爲它使用的 JavaScriptSerializer類以及其性能不佳或...?

WebMethod技術可以非常挑剔,有時會拒絕返回JSON,儘管接受標頭。圍繞一個辦法是做這樣的事情:

[WebMethod] 
public static void GetPerson() 
{ 
    Person p = new Person() 
    { 
     Id = 1, 
     Name = "Test" 
    }; 
    HttpContext.Current.Response.ResponseType = "application/json"; 
    HttpContext.Current.Response.Write(JsonConvert.SerializeObject(p)); 
    HttpContext.Current.Response.End(); 
} 

你失去了談判的內容(除非你手動實現它通過檢查請求頭),但你得到了它是如何序列化的更多的控制。

+0

你說'WebMethod技術可以非常挑剔,有時會拒絕返回JSON'。這是否包含其他轉換庫,如JSON.NET? – Mivaweb 2014-12-05 15:48:32

+0

當我說拒絕返回JSON時,我的意思是它忽略了請求標題並將其序列化爲XML。這與您使用的是哪個JSON序列化程序無關,它與WebMethod實現如何在幕後編碼有關。 – mason 2014-12-05 15:49:49

+0

所以爲了簡短起見,創建沒有返回類型的WebMethods並使用轉換器將結果寫回響應流將是最佳做法。或者使用ASP.NET Web API? – Mivaweb 2014-12-05 15:52:24