Как бороться с обнуляемыми ссылочными типами с System.Text.Json? - PullRequest
2 голосов
/ 04 октября 2019

Я обновил свой проект до netcore 3.0, и я нахожусь в процессе рефакторинга проекта, чтобы использовать новую функцию типов ссылочных значений, которые можно обнулять, но застрял довольно быстро из-за следующей проблемы. потреблять REST API, который возвращает следующий JSON:

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

Этот API всегда возвращает имя / год, поэтому они не могут быть обнулены.

Я бы использовал этот простой класс для сериализации:

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

И я бы сериализовал это для экземпляра Car, используя новый System.Text.Json

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

Это все работает, но при включении обнуляемых ссылочных типов я получаю предупреждение в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 serializer не поддерживает конструкторы с параметрами.

Так что мой вопрос: как бы я объявил Car, чтобы Name не обнулялся, и чтобы он работал с System.Text.Json без получения предупреждения «не обнуляемое»? `

Я не хочу делать его обнуляемым, потому что мне нужно было бы делать нулевые проверки практически всего при включении обнуляемых ссылочных типов, а также с помощью REST APIв моем примере говорится, что они всегда при условии, что они не должны быть обнуляемыми.

1 Ответ

0 голосов
/ 04 октября 2019

После прочтения msdocs я узнал, как решить эту проблему.

Так что, пока System.Text.Json не сможет создать экземпляры классов с параметрами в их конструкторе, класс Car будет иметьвыглядеть так:

public class Car
{
    public string Name { get; set; } = default!;
    public int Year { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...