技巧/訣竅:用 .NET 3.5 建立 ToJSON() 擴充方法 (木野狐譯)

  • 22966
  • 0
  • 2011-07-10

摘要:技巧/訣竅:用 .NET 3.5 建立 ToJSON() 擴充方法 (木野狐譯)

【原文位址】 Tip/Trick: Building a ToJSON() Extension Method using .NET 3.5
【原文發表日期】 Monday, October 01, 2007 10:33 PM

今年早些時候,我透過blog介紹了 C# 和 VB 語言的一項新的擴充特性 "擴充方法"。

擴充方法讓開發者可以向已有的 CLR 型別的公共契約中添加新的方法,而不需要子類化或重新編譯原有的型別。透過這種做法,可以使很多有用的應用場景成為可能(包括 LINQ)。同時,擴充方法也可以用來非常方便地向程式碼中添加 "語法糖"。

過去幾個月,我一直在準備一些很酷的擴充方法的清單,並計劃在有空的時候實現它們(不確定何時…但至少我還能從這些想法中獲得樂趣)。在上述清單中有兩個擴充方法的應用場景,分別是用於為任意 .NET 物件自動生成JSON (JavaScript Object Notation)或 XML 序列化字串的。

簡單場景:ToJSON() 擴充方法

假設我有一個 Person 類定義如下(注意:我使用了 自動屬性的新特性來實現):

接下來,我就可以初始化一系列 Person 物件的集合,然後只需叫用 ToJSON() 擴充方法,就能得到表示該集合內容的 JSON 字串。如下所示:

這和 .NET 中內建的,Object 類別的 ToString() 方法叫用方式很相似 —— 只是生成的結果是表示集合內容的 JSON 格式的字串而已。然後我們就可以在 AJAX 場景的客戶端使用它:

注意:點擊上圖中偵錯器的放大鏡圖示,可以打開 "文字視覺化器(Text Visualizer)",能更方便的查看 JSON 序列化字串:

接下來,這個字串格式在客戶端可以用 JavaScript 來實體化為合適的 JavaScript 物件,用於表示我的集合內容(註: ASP.NET AJAX 有一個內建的 JavaScript 庫支援這些特性)。

實現 ToJSON 擴充方法

實現一個基本的 ToJSON() 擴充方法很簡單。只要使用 System.Web.Script.Serialization 命名空間下的 JavaScriptSerializer 類即可,然後像下面所示的那樣定義兩個擴充方法。其中一個方法用於對目標物件圖(object graph)進行 "深" 的序列化,而另一個方法則是一個重載的版本,它允許你指定序列化的深度(比如:ToJSON(2) 只序列化 2 個層次的深度)。

注意,上面的 ToJSON() 擴充方法只是針對 「Object」 型別而定義的——這意味著它可以被用於 .NET 中的任何型別(不限於集合)。也就是說,我們不僅能對上述集合叫用 .ToJSON() 方法,還可以對單獨的 Person 物件叫用 ToJSON() 方法,或者任意其他的 .NET 型別都可以。

要使用上述擴充方法,只需在程式的頂部添加如下命名空間的引用即可:

然後 VS 2008 就可以為任意物件提供針對這些擴充方法的程式碼自動完成和編譯時支援功能:

注意:除了 JavaScriptSerializer 類之外,.NET 3.5 還包含一個新的new System.Runtime.Serialization.DataContractJsonSerializer class 類別 ,你也可以用它來做 JSON 序列化/反序列化的工作。

小結

希望以上的例子能給你一個使用擴充方法來封裝功能的範例。下次希望我們一起來看一些好的工具庫,用於提供類似有用的擴充方法的功能。

我非常想看到其他關於可復用的擴充方法使用場景的建議(請透過這篇文章的評論來建議)。然後我們可以琢磨出,如何建立一個好的 CodePlex 專案,來把這些方法捆綁到一個庫中以便利用。

希望這篇文章對你有用,

Scott

註:請透過我的 技巧/訣竅 和教程頁面 找到我寫的更多有用的 ASP.NET 和 .NET 的文章。