Десериализовать результаты HTTPClient.ReadAsAsync в список объектов - PullRequest
0 голосов
/ 12 мая 2019

Попытка десериализации JSON, возвращенного из API. Ответ имеет следующий формат:

{  
 "items":[  
  {  
     "candidateId":40419,
     "firstName":"Adelaida",
     "lastName":"Banks",

  }
   ....
 ]
}

Я использую HttpClient для вызова API следующим образом:

  List<Candidate> model1 = null;

  client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "00000");
  HttpResponseMessage response = await client.GetAsync(MyURL);
  response.EnsureSuccessStatusCode();
  var responseBody = await response.Content.ReadAsStringAsync();


   model1 = JsonConvert.DeserializeObject<List<Candidate>>(responseBody);

И кандидат в класс определяется следующим образом:

  public class Candidate
{
    public string candidateId { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string email { get; set; }
    public int phone { get; set; }
    public int mobile { get; set; }

}

Но я получаю исключение:

Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1 [AirCall.Controllers.Candidate]', поскольку для типа требуется массив JSON (например, [1,2,3]) для правильной десериализации.

Интересно, потому что список элементов в ответе находится внутри элемента "Items"? Есть идеи?

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Ваша модель должна выглядеть следующим образом

   public class Model
  {
    public List<Candidate> items { get; set; }
  }
  public class Candidate
  {
    public string candidateId { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string email { get; set; }
    public int phone { get; set; }
    public int mobile { get; set; }

  }

И вам нужно десериализовать это так

model1 = JsonConvert.DeserializeObject<Model>(responseBody);

Где model1 - это экземпляр Model.

В основном ваша модель не соответствует json.

"items" - это свойство в отображаемом вами ответе json.

0 голосов
/ 12 мая 2019

Я делаю что-то вроде этого:

  using (var client = new HttpClient())
            {
                var apiUrl = _config["MicroService:Base"] + string.Format("/Exam/{0}", examId);

                var response = client.SendAsync(new HttpRequestMessage(HttpMethod.Get, apiUrl))
                    .Result;

                if (!response.IsSuccessStatusCode)
                    return Task.FromCanceled<ExamDetails>(new CancellationToken(true));

                var content = response.Content.ReadAsStringAsync().Result;
                return Task.FromResult((DtoExamDetails)JsonConvert.DeserializeObject(content,
                    typeof(ExamDetails)));
            }

и моя модель такая:

 public class ExamDetails
{
    public int Id { get; set; }
    public string Title { get; set; }
    public long CreateBy { get; set; }
    public string CreateByName { get; set; }
    public long CreateDate { get; set; }

}

даже вы можете использовать такой список:

<List<ExamDetails>> instead of <ExamDetails>
...