19

プロジェクトを netcore 3.0 にアップグレードし、新しい null 許容参照型機能を使用するようにプロジェクトをリファクタリングしている最中ですが、次の問題が原因ですぐに行き詰まりました。

次の JSON を返す REST API を使用するとします。

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

この API は常に名前/年を返すため、null 非許容です。

この単純なクラスを逆シリアル化に使用します。

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

Carそして、これをnew を使用してインスタンスにデシリアライズしますSystem.Text.Json

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

これはすべて機能しますが、null 許容参照型を有効にすると、null 非許容として宣言されているが null になる可能性があるCarクラスで警告が表示されます。Nameプロパティを初期化せずにこのオブジェクトをインスタンス化できるため、これを取得する理由を理解してい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はパラメーターを持つコンストラクターをサポートしていないため、これは機能しません。

したがって、私の質問は次のとおりです。それをnull不可に宣言し、「null不可」の警告を表示せずに動作させるにはどうすればよいCarですNameSystem.Text.Json?`

null 許容の参照型を有効にする場合、基本的にすべてに対して null チェックを行う必要があるため、null を許容したくありません。

4

3 に答える 3

6

アップデート

System.Text.Jsonfor .NET 5 はパラメーター化されたコンストラクターをサポートするようになったため、これはもう問題にはなりません。

https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-immutability?pivots=dotnet-5-0を参照してください

以下の古い回答

msdocsを読んだ後、この問題を解決する方法を見つけました。

したがってSystem.Text.Json、コンストラクターでパラメーターを使用してクラスをインスタンス化できなくなるまで、クラスは次のCarようにする必要があります。

public class Car
{
    public string Name { get; set; } = default!;
    public int Year { get; set; }
}
于 2019-10-04T09:30:04.960 に答える