Ожидается, что JsonSerializer.Deserialize вызовет исключение при десериализации другого класса

В .NET Core 3.1 я использую System.Text.Json.JsonSerializer для обработки своих объектов Json. Когда я пытался написать случай ошибки, когда JsonSerializer.Deserialize<T>() получает строку Json другого типа, чем T, я не получаю никакого исключения.

Вот пример кода:

using System;
using System.Text.Json;

namespace JsonParsing
{
    class Program
    {
        {
            try
            {
                B b = JsonSerializer.Deserialize<B>( JsonSerializer.Serialize( new A() { a = "asdf" } ) );
                Console.WriteLine( $"b:{b.b}" );
            }
            catch( JsonException ex )
            {
                Console.WriteLine( $"Json error: {ex.Message}" );
            }
        }
    }

    public class A
    {
        public A() {}

        public string a { get; set; }
    }

    public class B
    {
        public B() {}

        public string b { get; set; }

        public C c { get; set; }
    }

    public class C
    {
        public C() {}

        public int c { get; set; }
    }
}

Я ожидал, что выдаст JsonException, как описано в System.Text.Json.JsonSerializerSystem_System_Deserialize_System.Text.Json.JsonSerializerSystem_System_Deserialize_System.Text.Json.JsonSerializerSystem_System_Start Документация Microsoft. Вместо этого я получаю в Console.WriteLine( $"b:{b.b}" ) объект B с каждым свойством, содержащим null.

Я что-то упускаю?

Если вы ищете эквивалент MissingMemberHandling от Newtonsoft или ItemRequired в системе . text.json, значит, его не существует.   —  person SzeliTom    schedule 15.01.2021

Из docs: Обязательные свойства … System.Text.Json не генерирует исключение, если не получено значение для одного из свойств целевого типа … Чтобы десериализация завершилась неудачно если в JSON нет свойства, реализуйте настраиваемый преобразователь.   —  person SzeliTom    schedule 15.01.2021

А также из docs MissingMemberHandling … System.Text.Json игнорирует дополнительные свойства в JSON, за исключением случаев, когда вы используете атрибут [JsonExtensionData]. Нет никакого обходного пути для функции отсутствующего участника.   —  person SzeliTom    schedule 15.01.2021

Ладно, я понял. Спасибо за помощь   —  person SzeliTom    schedule 15.01.2021

См. также:  vscode cant ssh connect Процесс попытался записать в несуществующий канал
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. SzeliTom

    Согласно документации, взыскание выписывалось, если:

    JSON недействителен.
    -или-
    TValue несовместим с JSON.
    -или-
    Не удалось прочитать значение из модуля чтения.

    Код :

    JsonSerializer.Serialize( new A { a = "asdf" } )
    

    Создайте json как:

    { "a", "asdf" }
    

    Таким образом, исключение не было создано, потому что:
    1 — Json действителен.
    2 — B совместим с этим Json, это похоже на {}, b и c </ strong> не существуют в json, поэтому после десериализации будет иметь значение null.
    3 — Читатель может читать Json.

    Исключение будет вызвано, например, если json имеет вид: "" или []

    Надеюсь, вы найдете это полезным.

    Я неверно истолковал здесь слово совместимый. Спасибо за разъяснения! person SzeliTom; 15.01.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: