Может ли результат JsonSerializer.Deserialize быть нулевым?

Тип возвращаемого значения, показанный в документы для метода JsonSerializer.Deserialize, показывает тип возвращаемого значения как обнуляемый.

Если вы посмотрите на примеры десериализации в документах MS, вы увидите, что они несовместимы, поскольку первый и третий указывают тип возвращаемого значения как nullable...

WeatherForecast? weatherForecast = 
  JsonSerializer.Deserialize<WeatherForecast>(jsonString);

... тогда как во втором примере отсутствует ?, что означает, что он не может быть обнулен.

Экспериментируя, кажется, что пока вы предоставляете действительный JSON (в противном случае вы получите исключение), возвращаемое значение всегда является ненулевым объектом указанного типа. Если имена свойств не совпадают, возвращаемый объект будет иметь значения по умолчанию для этих свойств, но вы никогда не получите нулевую ссылку — или, по крайней мере, я не смог найти способ.

Кто-нибудь может прояснить? Есть ли ситуация, в которой метод может вернуть null, не вызывая исключения? Если нет, то почему возвращаемые типы указаны как обнуляемые?

Спасибо

Что, если jsonString это "null"? :)

AKX 17.05.2022 17:49

Примеры могут быть частично из эпохи до Nullable.

Fildor 17.05.2022 17:57

@AKX, тогда метод выдает исключение, см. документы

Avrohom Yisroel 17.05.2022 18:04

@Fildor Да, я думал об этом или о том, что это была просто ошибка. Мне больше интересно узнать, может ли метод вообще вернуть null. Если не может, то мне не нужны никакие чеки. Если это возможно, мне нужно кодировать против этого

Avrohom Yisroel 17.05.2022 18:04

@AKX Ах, нет, я ошибаюсь! Я неправильно прочитал ваш комментарий, так как какая строка была null, и в этом случае было бы выдано исключение. Однако, если строка содержит текст "null", вы действительно получаете нулевой объект. Это странно, как будто он содержит любой другой (насколько я вижу) невалидный JSON, тогда вы получаете исключение

Avrohom Yisroel 17.05.2022 18:15

Базовый уровень: вы можете получить null, исключение или ожидаемое значение.

Fildor 17.05.2022 18:16

@ Филдор, да, похоже. Интересно, есть ли другой способ получить null. Это кажется настолько странным и маловероятным, что я ожидал, что он либо вернет new(), либо (что более вероятно) выдаст исключение.

Avrohom Yisroel 17.05.2022 18:23
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
7
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, анализ действительный JSON"null" с помощью сериализатора JSON должен вернуть null.

WeatherForecast? weatherForecast = 
  JsonSerializer.Deserialize<WeatherForecast>("null");

Обратите внимание, что другие строки действительный JSON, такие как "123", "\"bob\"", "[]", должны вызывать исключение, поскольку ни одна из них не представляет допустимую объект.

Спасибо за это. Мне кажется странным, что "null" является действительным JSON, но эй, ты узнаешь что-то новое каждый день ?

Avrohom Yisroel 17.05.2022 22:02

@AvrohomYisroel json.org/json-en.html

Alexei Levenkov 17.05.2022 22:43

Юмор меня. Пожалуйста, объясните, где в этом документе вы видите, что "null" является допустимым JSON. Это не набор пар имя/значение и не упорядоченный список значений. Это просто строка, и, насколько я понимаю из этой спецификации, строка не является допустимым объектом JSON. Тот факт, что он имеет значение "null", кажется, ничего не меняет, так как я нигде не вижу, чтобы это было указано. Не неловко, но, поскольку вы ссылаетесь на спецификацию, я хотел бы понять, как это позволяет "null". Спасибо еще раз.

Avrohom Yisroel 17.05.2022 23:59

@AvrohomYisroel json->элемент -> значение ws ws -> значение -> null. Обратите внимание, что null представлен в C# как "null" (строка C# из 4 символов без кавычек).

Alexei Levenkov 18.05.2022 00:01

Извините, я не понимаю, что вы имеете в виду. Я смотрел на две диаграммы, которые показывают структуру объекта JSON, и не понимаю, как то, что вы только что опубликовали, соответствует этому. Пожалуйста, можете объяснить подробнее. Спасибо.

Avrohom Yisroel 18.05.2022 00:03

Грамматика @AvrohomYisroel справа

Alexei Levenkov 18.05.2022 00:04

Я это видел, но не очень понял. Я просматривал основной документ, который предположительно объясняет спецификацию, и это не соответствовало тому, что вы предложили. Думаю, это не имеет большого значения. У меня есть ответ на мой основной вопрос, даже если я не совсем понимаю, почему это допустимый JSON. Спасибо еще раз.

Avrohom Yisroel 18.05.2022 00:28

@AvrohomYisroel подумайте о том, чтобы прочитать en.wikipedia.org/wiki/Backus%E2%80%93Naur_form, в котором объясняются основные принципы написания/использования правил грамматики. В этом конкретном случае «json» запускается «нетерминальным символом» (тот, который сам по себе не отображается в тексте), правило для него — «json: элемент» (JSON — это один «элемент»). «Элемент», в свою очередь, является другим нетерминальным символом, определяемым как «элемент: значение ws ws» (значение, окруженное пробелами); и, наконец, «value» имеет «null» (терминальный символ — присутствует в тексте как есть) в качестве одного из вариантов «value: ... |null|...». ...

Alexei Levenkov 18.05.2022 01:30

Обычно ожидается, что «JSON» будет описывать объект (т. Е. { "a":1 }, который анализируется с помощью этой грамматики как json -> элемент -> значение ws ws -> значение -> объект -> {members} -> {member} -> {string: element} -> { "a" : 1} (обратите внимание, что начальная часть та же самая json-> ws value ws -> value - null это просто другой вид "значения" с точки зрения JSON)

Alexei Levenkov 18.05.2022 01:32

Другие вопросы по теме