我最近因為支援 Quicktype 開源專案,新增了 System.Text.Json (C#) 的程式碼產生器功能,因此更加理解 System.Text.Json 的 Converter 撰寫方式。在這之前,我其實我都還是偏好使用 Newtonsoft.Json (俗稱 Json.NET
) 來進行 JSON 的序列化/反序列化工作,原因就在於 Json.NET 有很多「方便」又「豐富」的功能與特性在 System.Text.Json
都找不到,因此剛入門 System.Text.Json
的人一定會覺得綁手綁腳,很多原本能動的 Code 都不能 Run 了。今天這篇文章,我打算來分享如何讓 System.Text.Json
支援 dynamic 動態型別,讓你可以用「弱型別」的方式操作靈活的 JSON 資料。
使用方式
我參考自這篇的原始碼進行優化,自行開發出這份更加完整的 DynamicJsonConverter
類別,可以相當漂亮的支援動態型別。
-
下載我寫的 DynamicJsonConverter 類別
-
在主程式中建立一個 JsonSerializerOptions
物件並加入 DynamicJsonConverter
var serializerOptions = new JsonSerializerOptions
{
Converters = { new DynamicJsonConverter() }
};
-
測試 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 技術愛好者俱樂部 社團中有篇貼文有著相當豐富的討論,底下我整理一些有用的參考連結,方便大家學習:
相關連結