Я пытаюсь понять, почему пользовательский класс детериализации должен читать до конца потока JSON, даже если он уже дает необходимые данные, в противном случае дезиализация проходит с JSOnexception , что заканчивается, и в инициализации нет. />
Я прочитал документацию Microsoft для system.text.json < /code> ([1], [2]), но не смог бы понять это. < /p>
Вот пример документа: < /p>
Код: Выделить всё
{
"Response": {
"Result": [
{
"Code": "CLF",
"Id": 49,
"Type": "H"
},
{
"Code": "CLF",
"Id": 42,
"Type": "C"
}
]
}
}
< /code>
Метод класса DTO и Deserialization определяется следующим образом: < /p>
public class EntityDto
{
public string Code { get; set; }
public int Id { get; set; }
public string Type { get; set; }
}
// This method is a part of class EntityDtoIEnumerableConverter : JsonConverter
public override IEnumerable Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartObject)
{
throw new JsonException("JSON payload expected to start with StartObject token.");
}
while ((reader.TokenType != JsonTokenType.StartArray) && reader.Read()) { }
var eodPostions = JsonSerializer.Deserialize(ref reader, options);
// This loop is required to not get JsonException
while (reader.Read()) { }
return new List(eodPostions);
}
< /code>
Вот как называется класс десериализации. < /p>
var serializerOptions = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
serializerOptions.Converters.Add(new EntityDtoIEnumerableConverter());
HttpResponseMessage message = await httpClient.GetAsync(requestUrl);
message.EnsureSuccessStatusCode();
var contentStream = await msg.Content.ReadAsStreamAsync();
var result = await JsonSerializer.DeserializeAsync(contentStream, serializerOptions);
Подробнее здесь: https://stackoverflow.com/questions/621 ... uch-or-not
Мобильная версия