從Newtonsoft.Json遷移到System.Text.Json的經驗分享

引言

在.NET Core的發展過程中,微軟推出了System.Text.Json作為內建的JSON處理庫,以替代長期以來廣泛使用的Newtonsoft.Json (也稱為Json.NET)。本文將分享我在從Newtonsoft.Json遷移到System.Text.Json過程中的經驗,特別是一些可能遇到的"坑"以及解決方案。

為什麼要遷移?

  • System.Text.Json的優勢
    • 更好的性能
    • 與.NET Core的深度整合
    • 減少外部依賴

主要差異

  1. 命名策略
  2. 日期時間處理
  3. 類型處理和多態性
  4. 循環引用

遇到的問題:JSON輸出變成小駝峰命名

問題描述

在遷移過程中,我驚訝地發現原本使用Pascal命名法(大駝峰)的JSON輸出突然變成了Camel命名法(小駝峰)。這是因為System.Text.Json和Newtonsoft.Json在默認命名策略上的差異。

原因分析

  • Newtonsoft.Json默認保持屬性名稱不變
  • System.Text.Json默認使用Camel命名法

解決方案

要解決這個問題,我們可以在配置System.Text.Json序列化選項時指定命名策略:

1
2
3
4
5
6
7
8
9
10
using System.Text.Json;
using System.Text.Json.Serialization;

var options = new JsonSerializerOptions
{
PropertyNamingPolicy = null // 使用此設置保持原始屬性名稱
};

// 使用選項進行序列化
string json = JsonSerializer.Serialize(myObject, options);

其他常見問題及解決方案

1. 日期時間格式

System.Text.Json默認使用ISO 8601格式,而Newtonsoft.Json允許更多自定義。

解決方案:使用自定義的JsonConverter

2. 處理null值

System.Text.Json默認不序列化null值,而Newtonsoft.Json會。

解決方案:設置JsonSerializerOptions.DefaultIgnoreCondition

3. 類型處理和多態性

System.Text.Json在處理複雜類型和多態性時不如Newtonsoft.Json靈活。

解決方案:使用自定義JsonConverter或考慮保留Newtonsoft.Json用於複雜場景

遷移步驟

  1. 評估當前使用情況
  2. 更新包引用
  3. 修改序列化和反序列化代碼
  4. 處理命名策略
  5. 調整日期時間處理
  6. 處理自定義轉換器
  7. 測試和驗證

結論

從Newtonsoft.Json遷移到System.Text.Json雖然可能遇到一些挑戰,但通過適當的配置和調整,大多數問題都可以得到解決。遷移帶來的性能提升和與.NET Core的更好集成是值得的。然而,對於一些特別複雜的場景,可能需要考慮混合使用兩個庫或暫時保留Newtonsoft.Json。

參考資料