System.text.json Deserialization не удается с JSonexception «Читать до большого или недостаточно»C#

Место общения программистов C#
Ответить
Anonymous
 System.text.json Deserialization не удается с JSonexception «Читать до большого или недостаточно»

Сообщение Anonymous »

Этот вопрос относится к пользовательским классам десериализации для system.text.json в .net Core 3.1.

Я пытаюсь понять, почему пользовательский класс детериализации должен читать до конца потока 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);
Когда последний цикл while while (reader.read ()) {} в методе Deserialization отсутствует, или прокомментирован, последний вызов await jsonerializer.deserializeasync

Подробнее здесь: https://stackoverflow.com/questions/621 ... h-or-not-e
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»