В .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.JsonSerializer
System_System_Deserialize_System.Text.Json.JsonSerializer
System_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
Согласно документации, взыскание выписывалось, если:
Код :
Создайте json как:
Таким образом, исключение не было создано, потому что:
1 — Json действителен.
2 —
B
совместим с этим Json, это похоже на{}
, b и c </ strong> не существуют в json, поэтому после десериализации будет иметь значение null.3 — Читатель может читать Json.
Исключение будет вызвано, например, если json имеет вид:
""
или[]
Надеюсь, вы найдете это полезным.
Я неверно истолковал здесь слово совместимый. Спасибо за разъяснения! — person SzeliTom; 15.01.2021