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

ASP.NET 中使用 Json.NET 實現 JSON 序列化與反序列化完整教學

     編輯:ASP.NET 基礎

Json.NET 簡介

Json.NET (Newtonsoft.Json) 是 .NET 生態系最廣泛使用的 JSON 處理庫,特點:

  • 高效能、支援 .NET Framework / .NET Core / .NET 5+
  • 彈性序列化控制(屬性忽略、命名策略、日期格式、Null 處理)
  • LINQ to JSON (`JObject`/`JArray`) 動態操作 JSON 結構
  • 支援 `DataContract`、`DataMember`、自訂 `JsonConverter`

核心類別:JsonConvert

方法說明
SerializeObject(object)物件 → JSON 字串
DeserializeObject<T>(string)JSON 字串 → 強型別物件
DeserializeObject(string, Type)JSON 字串 → 指定型別物件 (非泛型)
SerializeObject(object, settings)自訂序列化設定

完整實作範例:Web Service 互動

1. 定義資料模型

public class Employee
{
    public int EmployeeID { get; set; }
    public string EmployeeName { get; set; }
    public string[] EmployeeInfo { get; set; } // 陣列支援
}

2. 建立 Web Service (ASMX)

[WebService(Namespace = "https://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class EmployeeService : System.Web.Services.WebService
{
    [WebMethod]
    public string ToJson(int employeeID, string employeeName, string[] employeeInfo)
    {
        var emp = new Employee
        {
            EmployeeID = employeeID,
            EmployeeName = employeeName,
            EmployeeInfo = employeeInfo
        };
        // 物件 → JSON
        return JsonConvert.SerializeObject(emp);
    }

    [WebMethod]
    public string FromJson(string jsonString)
    {
        // JSON → 物件
        var emp = JsonConvert.DeserializeObject(jsonString);
        return $"ID: {emp.EmployeeID}, Name: {emp.EmployeeName}, Info: {string.Join(", ", emp.EmployeeInfo)}";
    }
}

3. 前端頁面互動

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Services><asp:ServiceReference Path="~/EmployeeService.asmx" /></Services>
</asp:ScriptManager>

<input type="text" id="txtID" placeholder="員工編號" />
<input type="text" id="txtName" placeholder="姓名" />
<textarea id="txtInfo" placeholder="資訊(逗號分隔)"></textarea>
<button onclick="toJson()">序列化為 JSON反序列化

4. 執行結果展示

JSON 序列化反序列化示意

進階序列化設定

var settings = new JsonSerializerSettings
{
    // 命名策略:CamelCase (JS 慣例)
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
    
    // 日期格式:ISO 8601
    DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffZ",
    
    // 忽略 Null 值屬性
    NullValueHandling = NullValueHandling.Ignore,
    
    // 忽略預設值
    DefaultValueHandling = DefaultValueHandling.Ignore,
    
    // 格式化輸出 (除錯用)
    Formatting = Formatting.Indented,
    
    // 循環參考處理
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
    
    // 列舉輸出字串而非數字
    Converters = { new StringEnumConverter() }
};

string json = JsonConvert.SerializeObject(myObject, settings);

ASP.NET Core / Web API 內建整合

.NET Core 內建 `System.Text.Json`,但可輕易切換回 Json.NET:

// Startup.cs
services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
    });

LINQ to JSON 動態操作

// 建立 JSON
var jobj = new JObject
{
    ["id"] = 123,
    ["name"] = "Test",
    ["tags"] = new JArray("A", "B", "C"),
    ["meta"] = new JObject { ["created"] = DateTime.UtcNow }
};

// 查詢
string name = (string)jobj["name"];
var tags = jobj["tags"].Values();

// 修改
jobj["status"] = "active";
jobj.Remove("meta");

// 輸出
string json = jobj.ToString(Formatting.Indented);

效能優化建議

  • 重複使用 `JsonSerializerSettings` 實例,避免每次建立
  • 大量序列化時考慮 `JsonSerializer` 串流寫入 (`JsonTextWriter`)
  • 高頻呼叫路徑可預編譯 `JsonSerializer` (Source Generator)
  • .NET Core 3.0+ 考慮 `System.Text.Json` 獲得更好效能 (但功能較少)

結語

Json.NET 以靈活、強大、成熟成為 .NET JSON 處理事實標準。掌握 `JsonConvert` 核心方法、序列化設定微調、LINQ to JSON 動態操作,即能應對絕大多數 JSON 互操作場景。現代專案建議配合 ASP.NET Core 內建 DI 註冊統一設定,確保全應用序列化行為一致。

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