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中文网其他相关文章!