Моя цель - использовать System.text.Json для синтаксического анализа ответа остального API. Ответ возвращает один или несколько элементов, но если возвращается только один элемент, его не окружают скобки [] (что затрудняет анализ).

Десериализация:

// i need a list here to process data
var response = JsonSeralizer.Deseralize<IList<ExampleResponse>>(content);

Пример ответа 1:

[
 {
  "Status": "Healthy"
 },
 {
  "Status": "Healthy"
 }
]

Пример ответа 2:

{
 "Status": "Healthy"
}

Как я могу написать собственный конвертер, используя JsonConverter<T>, который может анализировать отдельный элемент или весь список?

0
Manuel 23 Сен 2021 в 16:41

3 ответа

Лучший ответ

Один из вариантов - создать собственный конвертер (унаследованный от JsonConverter)

Хотя в этом случае я бы, наверное, просто написал

var isList = content.StartsWith("[");
var response = isList ? JsonSeralizer.Deseralize<IList<ExampleResponse>>(content)
 : new IList<ExampleResponse> { JsonSeralizer.Deseralize<ExampleResponse>(content) };
0
kmac 23 Сен 2021 в 13:52

Вы можете проверить, начинается ли content с '{' в этом случае десериализовать в отдельный элемент и после этого создать новый List из отдельного элемента.

List<ExampleResponse> response;
if (content.StartsWith("{"){
   response = new List<ExampleResponse>(){
               JsonSerilizer.Deserialize<ExampleResponse>(content)
             };
else
{
    response = JsonSeralizer.Deseralize<IList<ExampleResponse>>(content);
}
0
JowJoris 23 Сен 2021 в 13:55

Если вы не можете изменить вывод REST API, чтобы он всегда возвращал массив, вы можете проверить строку перед ее анализом и добавить скобки. Затем проанализируйте это.

Я сделал этот пример: https://dotnetfiddle.net/dhZIKq

0
Hernan Lavrencic 23 Сен 2021 в 14:13