如何使用 System.Text.Json 处理可为 null 的引用类型?

2024-01-25

我已将项目升级到 net core 3.0,并且正在重构项目以使用新的可为空引用类型功能,但由于以下问题很快就陷入困境。

假设我使用一个 REST api,它返回以下 JSON:

{
  "Name": "Volvo 240",
  "Year": 1989
}

此 api 始终返回名称/年份,因此它们不可为 null。

我将使用这个简单的类进行反序列化:

public class Car
{
    public string Name {get; set;}
    public int Year {get; set;}
}

我会将其反序列化为Car实例使用新的System.Text.Json

var car = JsonSerializer.Deserialize<Car>(json);

这一切都有效,但是当启用可为空的引用类型时,我在CarName被声明为不可为 null,但可以为 null。我明白为什么我得到这个,因为可以实例化这个对象而不初始化Name财产。

如此理想Car应该看起来像这样:

public class Car
{
    public string Name { get; }
    public int Year { get; }

    public Car(string name, int year)
    {
        Name = name;
        Year = year;
    }
}

但这不起作用,因为System.Text.Json序列化器不支持带参数的构造函数。

所以我的问题是:我如何声明Car以便Name是不可空的并让它工作System.Text.Json没有收到“不可为空”警告?

我不想使其可为空,因为在启用可为空引用类型时,我必须对基本上所有内容进行空检查,并且由于我的示例中的 REST API 表示它们始终提供它们不应该为空。


UPDATE

System.Text.Json.NET 5 现在支持参数化构造函数,因此这不再是问题。

See https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-immutability?pivots=dotnet-5-0 https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-immutability?pivots=dotnet-5-0

下面是旧答案

读完后msdocs https://learn.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references我找到了如何解决这个问题。

所以直到System.Text.Json无法在构造函数中使用参数实例化类,Car类必须如下所示:

public class Car
{
    public string Name { get; set; } = default!;
    public int Year { get; set; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 System.Text.Json 处理可为 null 的引用类型? 的相关文章

随机推荐