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

淺析 JSON 序列化與反序列化:.NET 核心技術詳解

     編輯:ASP.NET 基礎

前言

在現代 .NET 開發中,JSON(JavaScript Object Notation)已成為數據交換的標準格式。無論是 Web API、配置文件還是前後端通信,高效地將對象序列化為 JSON 字符串、或將 JSON 反序列化為對象,都是開發者必備的核心技能。本文將系統介紹 .NET Framework 中兩種經典的 JSON 序列化方案:JavaScriptSerializer 與 DataContractJsonSerializer,並通過實戰代碼演示其用法、屬性控制及優缺點對比。

方案一:JavaScriptSerializer —— 輕量級的腳本序列化器

System.Web.Script.Serialization.JavaScriptSerializer 位於 System.Web.Extensions.dll 中,專為 ASP.NET AJAX 設計,使用簡單、無需額外配置,適合輕量級場景。

1. 定義實體類

public class Personnel
{
    public int Id { get; set; }
    public string Name { get; set; }
}

2. 序列化與反序列化實戰

protected void Page_Load(object sender, EventArgs e)
{
    Personnel personnel = new Personnel { Id = 1, Name = "小白" };
    JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();

    // 序列化:對象 → JSON 字符串
    string json = jsonSerializer.Serialize(personnel);
    // 輸出:{"Id":1,"Name":"小白"}

    // 反序列化:JSON 字符串 → 對象
    Personnel deserialized = jsonSerializer.Deserialize<Personnel>(json);
}

3. 忽略屬性:ScriptIgnoreAttribute

若需排除某屬性不參與序列化,可標記 [ScriptIgnore]:

public class Personnel
{
    [ScriptIgnore]
    public int Id { get; set; }
    public string Name { get; set; }
}
// 輸出:{"Name":"小白"}

方案二:DataContractJsonSerializer —— 契約驅動的企業級選擇

System.Runtime.Serialization.Json.DataContractJsonSerializer 基於數據契約模型,需配合 [DataContract] 和 [DataMember] 屬性使用,提供更精細的控制,適合 WCF 服務及嚴格契約場景。

1. 定義數據契約類

[DataContract]
public class People
{
    [DataMember(Name = "id")] // 自定義 JSON 鍵名
    public int Id { get; set; }

    [IgnoreDataMember] // 忽略該成員
    public string Name { get; set; }
}

2. 基於流的序列化與反序列化

protected void Page_Load(object sender, EventArgs e)
{
    People people = new People { Id = 1, Name = "小白" };
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(People));
    string json;

    // 序列化至 MemoryStream
    using (MemoryStream ms = new MemoryStream())
    {
        serializer.WriteObject(ms, people);
        json = Encoding.UTF8.GetString(ms.ToArray());
    }
    // 輸出:{"id":1}

    // 反序列化
    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
    {
        People obj = (People)serializer.ReadObject(ms);
    }
}

核心屬性對比表

特性JavaScriptSerializerDataContractJsonSerializer
命名空間System.Web.Script.SerializationSystem.Runtime.Serialization.Json
依賴項System.Web.Extensions.dllSystem.Runtime.Serialization.dll
屬性控制[ScriptIgnore][DataMember], [IgnoreDataMember], [DataContract]
日期格式\\/Date(1234567890)\\//ISO 8601 (預設)
性能較快,適合簡單對象較重,但功能豐富
適用場景ASP.NET WebForms、AJAX、輕量級WCF、REST API、嚴格契約、跨平台

最佳實踐建議

  • 新項目首選 System.Text.Json (.NET Core 3.0+):高性能、零依賴、原生支持異步、UTF-8 優化。
  • 維護舊版 .NET Framework 專案時,按需選擇:
    —— 簡單頁面、無 WCF:JavaScriptSerializer
    —— 服務契約、需精確控制:DataContractJsonSerializer
  • 避免在循環中頻繁創建序列化器實例,應復用靜態實例以提升性能。
  • 注意日期時間格式差異,前端解析時需統一處理。

總結

掌握 JavaScriptSerializer 與 DataContractJsonSerializer 的異同,能幫助你在不同 .NET 版本與架構下做出正確的技術選型。隨著 .NET 生態演進,建議漸進式遷移至 System.Text.Json,享受現代化、高性能的 JSON 處理體驗。

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