Я пытаюсь получить студентов из API и отобразить их информацию, но у меня возникли проблемы с десериализацией некоторого json, который я получаю. я использую С#

Вот что извлекается:

    [
       { 
          "firstName": "John", 
          "lastName: "Smith", 
          "id": "122386144", 
          "schoolYear": "Sophmore", 
          "Links": [
              { 
                 "url": "https://github.com/johnsmith", 
                 "comments": "Click to see some of my projects!"
              }
          ],
          "GPA": "3.6"
        },
        { 
          "firstName": "Jane", 
          "lastName: "Doe", 
          "id": "45624523", 
          "schoolYear": "Junior", 
          "Links": [
              { 
                 "url": "https://linkedin.com/janedoe", 
                 "comments": "Follow me on LinkedIn"
              }
          ],
          "GPA": "3.8"
        }
    ]

Вот что у меня есть для моего класса:

public class Student
{
   public string firstName { get; set; }
   public string lastName { get; set; }
   public int id { get; set; }
   public string schoolYear { get; set; }
   public string[] Links { get; set; }
}

public class Links
{
   public string url { get; set; }
   public string comments { get; set; }
}

И, наконец, мой код десериализует файл json. Я не могу указать фактический URL-адрес здесь, поэтому приведенный ниже baseUrl является просто заполнителем для этого сообщения:

string baseUrl = "https://CodeUniversity.com/"
List<Student> studentList = new List<Student>();

using (var client = new HttpClient())
{
   client.BaseAddress = new Uri(baseUrl);
   client.DefaultRequestHeaders.Clear();
   client.DeafultRequestHeaders.Accept.Add(new 
      MediaTypeWithQualityHeaderValue("application/json"));
   HttpResponseMessage response = await client.GetAsync("api/CS/students");
   
   if (response.IsSuccessStatusCode)
   {
      var studentResponse = response.Content.ReadAsStringAsync().Result;
      studentList = JsonConvert.DeserializeObject<List<Student>(studentResponse);
   }
}

Когда этот код запускается, я получаю следующую ошибку:

Элемент модели, переданный в словарь, имеет тип «Newtonsoft.Json.JsonReaderException», но для этого словаря требуется элемент модели типа «System.Collections.Generic.IEnumerable`1[University.Models.Student]».

Заранее спасибо за помощь.

0
duls 2 Фев 2022 в 22:18

3 ответа

Лучший ответ

Заменить public string[] Links на public Link[] Links { get; set; }

Используйте этот сайт для преобразования вашего json в класс C#

Класс ваших моделей

public partial class Student
    {
        [JsonProperty("firstName")]
        public string FirstName { get; set; }

        [JsonProperty("lastName")]
        public string LastName { get; set; }

        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("schoolYear")]
        public string SchoolYear { get; set; }

        [JsonProperty("Links")]
        public Link[] Links { get; set; }

        [JsonProperty("GPA")]
        public string Gpa { get; set; }
    }

    public partial class Link
    {
        [JsonProperty("url")]
        public Uri Url { get; set; }

        [JsonProperty("comments")]
        public string Comments { get; set; }
    }

И десериализовать

var c = JsonConvert.DeserializeObject<Student[]>(studentResponse);

Посмотрите пример здесь

0
Daniel 2 Фев 2022 в 23:59
Спасибо, это решило мою проблему. Необходимо установить ссылку на ссылку[]
 – 
duls
3 Фев 2022 в 00:09

Похоже, что ваше свойство Links класса Student должно иметь тип Links вместо string[]. Я бы также предложил переименовать класс Links в Link.

1
Fuffelschmerz 2 Фев 2022 в 22:32
Вау, спасибо, не уловил. Иногда полезно иметь другую пару глаз. Однако теперь я получаю эту ошибку после изменения типа: Элемент модели, переданный в словарь, имеет тип «Newtonsoft.Json.JsonSerializationException», но для этого словаря требуется элемент модели типа «System.Collections.Generic. IEnumerable`1[Университет.Модели.Студент].
 – 
duls
2 Фев 2022 в 22:42

Есть ошибка в json, добавьте " к lastName перед:. Также исправьте свойство Links и добавьте свойство GPA

public class Student
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public  int id { get; set; }
    public string schoolYear { get; set; }
    public double GPA { get; set; }
    public List<Link> Links { get; set; }
}

public class Link
{
   public string url { get; set; }
   public string comments { get; set; }
}
0
Serge 2 Фев 2022 в 23:05
Спасибо за ответ!
 – 
duls
3 Фев 2022 в 00:08