如何在System.Text.Json.JsonSerializer中使用类字段?

The*_*his 7 c# json.net .net-core-3.0 system.text.json

我最近将解决方案升级为全部.NET Core 3,并且我有一个类,要求类变量为字段。这是一个问题,因为新版本System.Text.Json.JsonSerializer不支持序列化或反序列化字段,而仅处理属性。

有什么方法可以确保下面的示例中的两个最终类具有相同的确切值?

using System.Text.Json;

public class Car
{
    public int Year { get; set; } // does serialize correctly
    public string Model; // doesn't serialize correctly
}

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!
}
Run Code Online (Sandbox Code Playgroud)

pav*_*nan 6

当前,字段不可序列化。但是正在进行开发工作。您可以关注此线程。https://github.com/dotnet/corefx/pull/39254

  • 还记录在[如何在 .NET 中序列化和反序列化 JSON:序列化行为](https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to#serialization-行为):*默认情况下,所有公共属性都被序列化。您可以指定要排除的属性...目前,字段被排除。* (3认同)
  • 您可以在.net core 3.1中使用Sytem.Text.Json &gt;=5.0.2包 (2认同)

NiK*_*iZe 5

如果您希望 API 项目中的所有 MvcController 都这样做,您可以在设置中执行类似的操作:

builder.Services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.IncludeFields = true;
});
Run Code Online (Sandbox Code Playgroud)