如何讓 System.Text.Json 支援 Dynamic 型別的序列化/反序列化 | The Will Will Web

The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何讓 System.Text.Json 支援 Dynamic 型別的序列化/反序列化

我最近因為支援 Quicktype 開源專案,新增了 System.Text.Json (C#) 的程式碼產生器功能,因此更加理解 System.Text.JsonConverter 撰寫方式。在這之前,我其實我都還是偏好使用 Newtonsoft.Json (俗稱 Json.NET) 來進行 JSON 的序列化/反序列化工作,原因就在於 Json.NET 有很多「方便」又「豐富」的功能與特性在 System.Text.Json 都找不到,因此剛入門 System.Text.Json 的人一定會覺得綁手綁腳,很多原本能動的 Code 都不能 Run 了。今天這篇文章,我打算來分享如何讓 System.Text.Json 支援 dynamic 動態型別,讓你可以用「弱型別」的方式操作靈活的 JSON 資料。

Converter

使用方式

我參考自這篇的原始碼進行優化,自行開發出這份更加完整的 DynamicJsonConverter 類別,可以相當漂亮的支援動態型別

  1. 下載我寫的 DynamicJsonConverter 類別

  2. 在主程式中建立一個 JsonSerializerOptions 物件並加入 DynamicJsonConverter

    var serializerOptions = new JsonSerializerOptions
    {
        Converters = { new DynamicJsonConverter() }
    };
    
  3. 測試 dynamic 轉換過程

    // 載入任意 JSON 文字檔內容
    var jsonText = File.ReadAllText("sample.json");
    
    dynamic obj = JsonSerializer.Deserialize<dynamic>(jsonText, serializerOptions);
    
    // 存取物件的方式
    // obj.name
    // obj.batters.batter[0].id
    // obj.batters.batter[0].type
    
    string json = JsonSerializer.Serialize(obj, serializerOptions);
    

完整程式碼

我的完整實作都放在 Gist 上面,大家可以自行參閱程式碼進行驗證、調整、修改,有任何能夠改進的地方,也歡迎給我回饋! 👍

https://gist.github.com/doggy8088/995a28b2655ec9529414c3df18aaa28e

相關討論

昨天 (2022/6/10) 在我的 台灣 .NET 技術愛好者俱樂部 社團中有篇貼文有著相當豐富的討論,底下我整理一些有用的參考連結,方便大家學習:

相關連結