.NET 生態系中常用的 JSON 序列化函式庫各有優缺,本文實測比較 Json.NET (Newtonsoft.Json)、ASP.NET AJAX (System.Web.Script.Serialization)、AjaxPro 在基礎型別、日期處理、型別資訊輸出三大場景的限制與表現。
string test = Newtonsoft.Json.JavaScriptConvert.SerializeObject("Hello World");
// 拋出例外: Token String in state Start would result in an invalid JavaScript object.
Json.NET 要求 JSON 根節點必須是物件 {...} 或陣列 [...],符合 RFC 4627 (舊標準)。雖然 RFC 7159 已放寬允許任意 JSON 值為根節點,但舊版本嚴格檢查。
SerializeObject 基礎型別)new { Value = "Hello World" }JValue:JValue.CreateString("Hello World").ToString()
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
string json = serializer.Serialize(new Store());
Store store = serializer.Deserialize<Store>(json);
\/Date(1264118400000)\/new Date(...) 處理new Date(parseInt(jsonDate.substr(6)))new Date(1264118400000) 或 ISO 8601 格式,前端可直接使用.NET 3.5 內建、無法引入外部套件的舊專案維護;新專案建議改用 Json.NET 或 System.Text.Json。
{
"__type": "TestPage_JQuery_TestJSONPage+Store, App_Web_tnrikb42, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
"Property1": "Value1",
...
}
__type 欄位包含完整組件資訊,導致 JSON 體積膨脹近一倍ArrayList 多型反序列化、繼承階層正確還原子類別屬性極少見,除非有特殊多型集合反序列化需求且不介意體積;一般專案不建議使用。
| 維度 | Json.NET | ASP.NET AJAX | AjaxPro |
|---|---|---|---|
| 基礎型別序列化 | 舊版不支援,新版支援 | 支援 | 支援 |
| 日期格式 | ISO 8601 / new Date(ms) (可配置) | Microsoft 專屬 \/Date(ms)\/ | ISO 8601 |
| 型別資訊輸出 | 可選 (TypeNameHandling) | 不輸出 | 強制輸出 __type |
| 效能 | 最快 | 中等 | 中等 |
| 功能豐富度 | 最高 (LINQ to JSON、Schema、自訂 Converter) | 基礎 | 基礎 |
| 相依性 | NuGet 套件 | .NET 3.5+ 內建 (System.Web.Extensions) | 獨立套件 |
| 現代建議 | ⭐ 首選 | 舊專案維護 | 不建議 |
Json.NET 仍是功能最完整的選擇,但需注意版本對基礎型別根節點的支援。ASP.NET AJAX 日期格式不標準,僅適合舊專案。AjaxPro 型別資訊冗長,一般專案不適用。新專案請優先使用 System.Text.Json。