Тип возвращаемого значения, показанный в документы для метода JsonSerializer.Deserialize
, показывает тип возвращаемого значения как обнуляемый.
Если вы посмотрите на примеры десериализации в документах MS, вы увидите, что они несовместимы, поскольку первый и третий указывают тип возвращаемого значения как nullable...
WeatherForecast? weatherForecast =
JsonSerializer.Deserialize<WeatherForecast>(jsonString);
... тогда как во втором примере отсутствует ?
, что означает, что он не может быть обнулен.
Экспериментируя, кажется, что пока вы предоставляете действительный JSON (в противном случае вы получите исключение), возвращаемое значение всегда является ненулевым объектом указанного типа. Если имена свойств не совпадают, возвращаемый объект будет иметь значения по умолчанию для этих свойств, но вы никогда не получите нулевую ссылку — или, по крайней мере, я не смог найти способ.
Кто-нибудь может прояснить? Есть ли ситуация, в которой метод может вернуть null
, не вызывая исключения? Если нет, то почему возвращаемые типы указаны как обнуляемые?
Спасибо
Примеры могут быть частично из эпохи до Nullable.
@AKX, тогда метод выдает исключение, см. документы
@Fildor Да, я думал об этом или о том, что это была просто ошибка. Мне больше интересно узнать, может ли метод вообще вернуть null
. Если не может, то мне не нужны никакие чеки. Если это возможно, мне нужно кодировать против этого
@AKX Ах, нет, я ошибаюсь! Я неправильно прочитал ваш комментарий, так как какая строка была null
, и в этом случае было бы выдано исключение. Однако, если строка содержит текст "null"
, вы действительно получаете нулевой объект. Это странно, как будто он содержит любой другой (насколько я вижу) невалидный JSON, тогда вы получаете исключение
Базовый уровень: вы можете получить null
, исключение или ожидаемое значение.
@ Филдор, да, похоже. Интересно, есть ли другой способ получить null
. Это кажется настолько странным и маловероятным, что я ожидал, что он либо вернет new()
, либо (что более вероятно) выдаст исключение.
Да, анализ действительный JSON"null"
с помощью сериализатора JSON должен вернуть null
.
WeatherForecast? weatherForecast =
JsonSerializer.Deserialize<WeatherForecast>("null");
Обратите внимание, что другие строки действительный JSON, такие как "123"
, "\"bob\""
, "[]"
, должны вызывать исключение, поскольку ни одна из них не представляет допустимую объект.
Спасибо за это. Мне кажется странным, что "null"
является действительным JSON, но эй, ты узнаешь что-то новое каждый день ?
@AvrohomYisroel json.org/json-en.html
Юмор меня. Пожалуйста, объясните, где в этом документе вы видите, что "null"
является допустимым JSON. Это не набор пар имя/значение и не упорядоченный список значений. Это просто строка, и, насколько я понимаю из этой спецификации, строка не является допустимым объектом JSON. Тот факт, что он имеет значение "null"
, кажется, ничего не меняет, так как я нигде не вижу, чтобы это было указано. Не неловко, но, поскольку вы ссылаетесь на спецификацию, я хотел бы понять, как это позволяет "null"
. Спасибо еще раз.
@AvrohomYisroel json->элемент -> значение ws ws -> значение -> null
. Обратите внимание, что null представлен в C# как "null"
(строка C# из 4 символов без кавычек).
Извините, я не понимаю, что вы имеете в виду. Я смотрел на две диаграммы, которые показывают структуру объекта JSON, и не понимаю, как то, что вы только что опубликовали, соответствует этому. Пожалуйста, можете объяснить подробнее. Спасибо.
Грамматика @AvrohomYisroel справа
Я это видел, но не очень понял. Я просматривал основной документ, который предположительно объясняет спецификацию, и это не соответствовало тому, что вы предложили. Думаю, это не имеет большого значения. У меня есть ответ на мой основной вопрос, даже если я не совсем понимаю, почему это допустимый JSON. Спасибо еще раз.
@AvrohomYisroel подумайте о том, чтобы прочитать en.wikipedia.org/wiki/Backus%E2%80%93Naur_form, в котором объясняются основные принципы написания/использования правил грамматики. В этом конкретном случае «json» запускается «нетерминальным символом» (тот, который сам по себе не отображается в тексте), правило для него — «json: элемент» (JSON — это один «элемент»). «Элемент», в свою очередь, является другим нетерминальным символом, определяемым как «элемент: значение ws ws» (значение, окруженное пробелами); и, наконец, «value» имеет «null» (терминальный символ — присутствует в тексте как есть) в качестве одного из вариантов «value: ... |null|...». ...
Обычно ожидается, что «JSON» будет описывать объект (т. Е. { "a":1 }
, который анализируется с помощью этой грамматики как json -> элемент -> значение ws ws -> значение -> объект -> {members} -> {member} -> {string: element} -> { "a" : 1} (обратите внимание, что начальная часть та же самая json-> ws value ws -> value - null
это просто другой вид "значения" с точки зрения JSON)
Что, если
jsonString
это"null"
? :)