首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 3.5 擴充方法實戰:打造通用 ToJSON() 序列化利器

     編輯:關於.NET

擴充方法:為既有型別注入新能力

.NET 3.5 引入的擴充方法,讓開發者無需繼承、無需重新編譯,即可為任何 CLR 型別「貼上」新方法。這不僅是 LINQ 的基石,更是打造領域專用語法糖的利器。本文示範如何為 object 型別新增 ToJSON(),實現一鍵序列化。

目標效果:一行代碼搞定 JSON 序列化

// 定義實體
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime BirthDate { get; set; }
}

// 使用擴充方法
var people = new List<Person>
{
    new Person { Name = "張三", Age = 25, BirthDate = new DateTime(1998, 5, 1) },
    new Person { Name = "李四", Age = 30, BirthDate = new DateTime(1993, 8, 15) }
};

string json = people.ToJSON();
// 結果:[{"Name":"張三","Age":25,"BirthDate":"1998-05-01T00:00:00"},...]

// 單一物件也適用
var person = new Person { Name = "王五", Age = 28 };
string singleJson = person.ToJSON();
// 結果:{"Name":"王五","Age":28,"BirthDate":"1995-01-01T00:00:00"}

核心實作:JavaScriptSerializer 封裝

using System;
using System.Web.Script.Serialization;

public static class JsonExtensions
{
    /// 
    /// 深度序列化為 JSON 字串
    /// 
    public static string ToJSON(this object obj)
    {
        if (obj == null) return "null";
        var serializer = new JavaScriptSerializer();
        return serializer.Serialize(obj);
    }

    /// 
    /// 可控制序列化深度的多載版本
    /// 
    public static string ToJSON(this object obj, int recursionLimit)
    {
        if (obj == null) return "null";
        var serializer = new JavaScriptSerializer { RecursionLimit = recursionLimit };
        return serializer.Serialize(obj);
    }
}

進階用法與注意事項

1. 命名空間引用與 IntelliSense

using YourNamespace.JsonExtensions; // 引用擴充方法所在命名空間

// VS2008 即可提供智慧提示
var json = myObject.ToJSON();

2. 替代方案:DataContractJsonSerializer

.NET 3.5 同時提供 System.Runtime.Serialization.Json.DataContractJsonSerializer,特點:

  • 需標註 [DataContract]/[DataMember],控制更精確
  • 效能略優於 JavaScriptSerializer
  • 支援序列化回呼(OnSerializing 等)
  • 不支援匿名型別直接序列化

3. 日期時間格式處理

JavaScriptSerializer 輸出 "/Date(1234567890123)/" 格式,前端需配合解析。若需 ISO 8601 格式,可自訂 JavaScriptConverter 或改用 JSON.NET(Newtonsoft.Json)。

4. 循環參考保護

預設 RecursionLimit = 100,複雜物件圖可能觸發例外。使用 ToJSON(50) 降低限制或實作自訂轉換器排除循環屬性。

實戰擴充:ToXML() 雙格式支援

public static string ToXML(this object obj)
{
    if (obj == null) return string.Empty;
    var serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
    using (var writer = new System.IO.StringWriter())
    {
        serializer.Serialize(writer, obj);
        return writer.ToString();
    }
}

總結

透過擴充方法封裝 JavaScriptSerializer,我們為所有 .NET 型別賦予了 ToJSON()/ToXML() 能力,極大提升 AJAX、Web API、日誌記錄等場景的開發效率。這正是「語法糖」的價值:用最直觀的方式表達業務意圖,隱藏底層繁瑣細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved