System.Text.Json:序列化與反序列化欄位
在較新的.NET版本中,System.Text.Json.JsonSerializer
是首選的JSON序列化和反序列化方法。然而,它對包含字段變數的類別提出了挑戰,因為這些變數並非預設支援。
問題所在
在舊版的.NET中,欄位變數可以包含在序列化/反序列化過程中。隨著JsonSerializer
的引入,只有屬性得到支持,導致以下問題:
<code class="language-csharp">using System.Text.Json; public class Car { public int Year { get; set; } // 正确序列化 public string Model; // 未正确序列化(字段变量) } static void Problem() { Car car = new Car() { Model = "Fit", Year = 2008, }; string json = JsonSerializer.Serialize(car); // {"Year":2008} Car carDeserialized = JsonSerializer.Deserialize<Car>(json); Console.WriteLine(carDeserialized.Model); // null! }</code>
解決方法
為了解決這個問題,有兩種策略:
1. .NET 5及更高版本
從.NET 5開始,可以透過以下方法序列化和反序列化公共欄位:
JsonSerializerOptions.IncludeFields
設定為true
[JsonInclude]
特性
範例:
<code class="language-csharp">using System.Text.Json; using System.Text.Json.Serialization; static void Main() { var car = new Car { Model = "Fit", Year = 2008 }; // 启用支持 var options = new JsonSerializerOptions { IncludeFields = true }; // 传递“options” var json = JsonSerializer.Serialize(car, options); // 传递“options” var carDeserialized = JsonSerializer.Deserialize<Car>(json, options); Console.WriteLine(carDeserialized.Model); // 输出 "Fit" } public class Car { public int Year { get; set; } [JsonInclude] public string Model; }</code>
2. .NET Core 3.x
在.NET Core 3.x中,不支援欄位序列化。作為一種變通方法,可以考慮使用自訂轉換器來實現所需的行為。更多資訊和詳細文檔,請參考以下資源:
以上是如何使用 System.Text.Json 序列化和反序列化欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!