Member 14637786 Ответов: 2

Свойство Null json создает нулевую коллекцию, даже если она инициализирована в конструкторе. Почему?


Код-это только пример, а не производственный код, настолько простой, насколько это возможно, чтобы показать проблему. Проблема в том, что коллекция является нулевой, если контроллер получает нулевую коллекцию MyItems.

Модели:

public class PBS
    {
        public PBS()
        {
            MyItems = new List<int>();
        }


        public ICollection<int> MyItems { get; set; }
    }

public class Command : PBS
{
    public int Id { get; set; }
}


Контроллер:

public async Task<IActionResult> CreateCommandAsync([FromBody] Command command)
{
    await Mediator.Send(command); //Mediator only calls handler based on command type
}


Что я уже пробовал:

Итак, вопрос в том, почему, когда я посылаю JSON контроллеру с MyItems = null, то коллекция MyItems является нулевой, а не пустой? Разве конструктор не должен просто превратить его в пустой список? Что я здесь делаю не так? Все остальные веб-API ядра 2.2

Kornfeld Eliyahu Peter

Речь идет о порядке...
Инициализация в конструкторе предшествует набору свойства, и это переопределяет Предыдущее значение с помощью null...
Вы можете написать некоторый код в установщике свойств для обработки специального случая null...

Member 14637786

Ладно, я понял. Таким образом, единственным решением здесь является явная реализация setter и инициализация пустой коллекции при нулевом значении?

2 Ответов

Рейтинг:
2

Richard Deeming

Если вы используете JSON.NET, попробуйте сделать свойство доступным только для чтения:

public class PBS
{
    public ICollection<int> MyItems { get; } = new List<int>();
}
JSON.NET справляется с этим правильно:
  • {}{"MyItems":[]};
  • {"MyItems":null}{"MyItems":[]};
  • {"MyItems":[1,2,3]}{"MyItems":[1,2,3]};

NB: К несчастью, новый System.Text.Json Апис[^] в настоящее время не могу справиться с этим - MyItems коллекция всегда будет пустой. Есть предложение добавить новый атрибут[^] чтобы обойти эту проблему.


Рейтинг:
0

Eliatrope

Привет,
вы также можете сделать это, как показано ниже

public ICollection<int> MyItems { get; set; } = new ICollection<int>() 

в этом случае вам не нужен никакой ctor / setter


Richard Deeming

Это не решит проблему операции. Если вы десериализовать JSON-представление этого класса с MyItems свойство установлено в null, он перезапишет значение, установленное в инициализаторе свойства.