System.Text.Json 序列化派生类属性

And*_*uin 10 .net c# json system.text.json

我正在将一个项目从 .NET 5 迁移Newtonsoft.JsonSystem.Text.Json.NET 5。

我有课:

abstract class Car
{
    public string Name { get; set; } = "Default Car Name";
}

class Tesla : Car
{
    public string TeslaEngineName { get; set; } = "My Tesla Engine";
}
Run Code Online (Sandbox Code Playgroud)

我试过:

var cars = new List<Car> 
{ 
    new Tesla(),
    new Tesla(),
    new Tesla()
};

var json = JsonSerializer.Serialize(cars);

Console.WriteLine(json);
Run Code Online (Sandbox Code Playgroud)

输出是:

[
  {"Name":"Default Car Name"},
  {"Name":"Default Car Name"},
  {"Name":"Default Car Name"}
]
Run Code Online (Sandbox Code Playgroud)

其中失去了我的财产:TeslaEngineName

那么如何序列化具有所有属性的派生对象呢?

Dav*_*idG 4

这是 System.Text.Json 的设计功能,请参阅此处了解更多详细信息。您的选择是:

  1. 继续使用 JSON.Net

  2. 使用其中一种解决方法,在这种情况下,请List<object>在序列化时使用 a 或强制转换列表。例如:

    var json = JsonSerializer.Serialize(cars.Cast<object>());
                                             ^^^^^^^^^^^^^^
    
    Run Code Online (Sandbox Code Playgroud)

    此选项的缺点是它仍然不会序列化派生类的任何嵌套属性。

  • 应该注意的是,这不会改变属性的序列化方式;这个技巧只适用于根对象。我找到了一种方法来说服 System.Text.Json 在序列化期间尊重属性的运行时类型:其类型必须是“object”。然而,这使得属性的**反序列化**非常困难(笨重的自定义 JsonConverter 类似乎是唯一的选择,更糟糕的是,JsonConverter 需要包含自定义序列化器)。请参阅 https://github.com/dotnet/runtime/issues/30083 (2认同)