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>
解決策
この問題を解決するには、2 つの戦略があります:
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 中国語 Web サイトの他の関連記事を参照してください。