Как обрабатывать отсутствие одинаковых строк в JSON
Что проверяют
Знаете ли вы, что делает десериализатор, когда в JSON нет поля, ожидаемого моделью, или имя не совпадает по регистру и стилю. Следом спрашивают, как отличить отсутствующее поле от поля со значением null и как сделать поле обязательным.
Как отвечать
Отталкивайтесь от System.Text.Json: он встроен в .NET и используется по умолчанию в ASP.NET Core. Newtonsoft.Json упомяните как вариант для старого кода.
- поведение по умолчанию: отсутствующее свойство молча получает значение по умолчанию, для строки это
null. Исключения нет, ошибка всплывёт позже какNullReferenceException; - регистр имён:
JsonSerializerбез настроек сравнивает имена с учётом регистра, а ASP.NET Core берётJsonSerializerDefaults.Web: без учёта регистра и camelCase. Задавайте[JsonPropertyName]или политику имён, в .NET 8 естьJsonNamingPolicy.SnakeCaseLower; - обязательные поля: модификатор
requiredиз C# 11 или атрибут[JsonRequired](.NET 7+). Без поля будетJsonExceptionсразу при чтении; - лишние поля: по умолчанию игнорируются, в .NET 8 это меняется через
JsonUnmappedMemberHandling.Disallow, а собрать их можно в свойство с[JsonExtensionData]; - nullable-аннотации: в .NET 9 появилась опция
RespectNullableAnnotations, она запрещаетnullдля ненулевых ссылочных типов; - без модели:
JsonDocumentилиJsonNodeиTryGetProperty. Так видно разницу между «поля нет» и «поле равноnull», что важно для PATCH; - Newtonsoft: обязательность через
[JsonProperty(Required = Required.Always)].
Итог: жёсткая схема на границе системы, дефолты через ?? только там, где отсутствие поля законно.
Где спотыкаются
Думают, что десериализатор упадёт на отсутствующем поле. Он молча вернёт объект с null, и падение случится в другом месте.
Проверяют в контроллере, где имена сравниваются без учёта регистра, а в фоновом воркере с JsonSerializer по умолчанию поле name уже не попадает в Name.
В Newtonsoft путают MissingMemberHandling.Error с обязательностью. Эта настройка ругается на лишние поля в JSON, а не на недостающие.