本文主要介绍NET Core 3.0 JsonSerializer,对象序列化不区分属性名大小写和派生类属性序列化方法及示例代码。

1、不区分大小写的属性匹配

默认情况下,反序列化将查找 JSON 与目标对象属性之间区分大小写的属性名称匹配。 若要更改此行为,请将
PropertyNameCaseInsensitive设置为 true:

var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
};
var weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(weatherForecast, options);

下面是采用 camel 大小写属性名称的示例 JSON。 它可以反序列化为具有 Pascal 大小写属性名称的以下类型。

{
"date": "2019-08-01T00:00:00-07:00",
"temperatureC": 25,
"summary": "Hot",
}

对应的类:

class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureC { get; set; }
public string Summary { get; set; }
}

2、对象中包含派生类属性

在编译时指定要序列化的类型时,不支持多态序列化。 例如,假设您有一个WeatherForecast类和一个派生类 WeatherForecastWithWind

class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureC { get; set; }
public string Summary { get; set; }
}
class WeatherForecastWithWind : WeatherForecast
{
public int WindSpeed { get; set; }
}

要序列化派生类型的属性,可以使用以下两种方法:

1) 调用 Serialize 的重载,以便在运行时指定类型

json = JsonSerializer.Serialize(weatherForecast, weatherForecast.GetType());

2) 将要序列化的对象声明为 object

json = JsonSerializer.Serialize<object>(weatherForecast);

两种方法都会 JSON 输出中包含 WindSpeed 属性:

{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureC": 25,
"Summary": "Hot",
"WindSpeed": 35
}

相关文档

.NET Core 3.0使用JsonSerializer(System.Text.Json)序列化和反序列化JSON

.NET Core 3.0 JsonSerializer排除类对象属性设置方法及示例代码

官方文档
https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json-how-to