在現代 .NET 開發中,JSON(JavaScript Object Notation)已成為數據交換的標準格式。無論是 Web API、配置文件還是前後端通信,高效地將對象序列化為 JSON 字符串、或將 JSON 反序列化為對象,都是開發者必備的核心技能。本文將系統介紹 .NET Framework 中兩種經典的 JSON 序列化方案:JavaScriptSerializer 與 DataContractJsonSerializer,並通過實戰代碼演示其用法、屬性控制及優缺點對比。
System.Web.Script.Serialization.JavaScriptSerializer 位於 System.Web.Extensions.dll 中,專為 ASP.NET AJAX 設計,使用簡單、無需額外配置,適合輕量級場景。
public class Personnel
{
public int Id { get; set; }
public string Name { get; set; }
}
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);
}
若需排除某屬性不參與序列化,可標記 [ScriptIgnore]:
public class Personnel
{
[ScriptIgnore]
public int Id { get; set; }
public string Name { get; set; }
}
// 輸出:{"Name":"小白"}
System.Runtime.Serialization.Json.DataContractJsonSerializer 基於數據契約模型,需配合 [DataContract] 和 [DataMember] 屬性使用,提供更精細的控制,適合 WCF 服務及嚴格契約場景。
[DataContract]
public class People
{
[DataMember(Name = "id")] // 自定義 JSON 鍵名
public int Id { get; set; }
[IgnoreDataMember] // 忽略該成員
public string Name { get; set; }
}
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);
}
}
| 特性 | JavaScriptSerializer | DataContractJsonSerializer |
|---|---|---|
| 命名空間 | System.Web.Script.Serialization | System.Runtime.Serialization.Json |
| 依賴項 | System.Web.Extensions.dll | System.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 優化。JavaScriptSerializerDataContractJsonSerializer掌握 JavaScriptSerializer 與 DataContractJsonSerializer 的異同,能幫助你在不同 .NET 版本與架構下做出正確的技術選型。隨著 .NET 生態演進,建議漸進式遷移至 System.Text.Json,享受現代化、高性能的 JSON 處理體驗。