Kingshuk_SP Ответов: 3

Десериализация строки ответа json в класс


Я получаю ответную строку JSON, которая является:

[{"Id":1,"Name":"name1"},{"Id":2,"Name":"name2"},{"Id":3,"Name":"name3"}]


теперь, если я попытаюсь десериализовать эту строку в объект класса, а также в XmlDocument, это не сработает. Вместо этого я получаю нулевое значение как в объекте класса, так и в объекте XmlDocument.

Что я уже пробовал:

Я попробовал следующее для десериализации в класс

using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
  if (resp.StatusCode == HttpStatusCode.OK)
  {
    StreamReader rd = new StreamReader(resp.GetResponseStream());
    string str = rd.ReadToEnd(); //Here I can see the response JSON string
    Student std = JsonConvert.DeserializeObject<Student>(str);
  }
}


Я попробовал следующее для десериализации в XmlDocument

using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
  if (resp.StatusCode == HttpStatusCode.OK)
  {
    StreamReader rd = new StreamReader(resp.GetResponseStream());
    string str = rd.ReadToEnd(); //Here I can see the response JSON string
    XmlDocument xDoc = new XmlDocument();
    xDoc = JsonConvert.DeserializeXmlNode(str);
  }
}

3 Ответов

Рейтинг:
2

Karthik_Mahalingam

Это JSON array так что разберите его с помощью массива Student

Student[] Students = JsonConvert.DeserializeObject<Student[]>(json);
            foreach (Student student in Students)
            {
                int id = student.Id;
                string name = student.Name;
                
            }


обеспечить Student класс выглядит примерно так
class Student
  {
      public int Id { get; set; }
      public string Name { get; set; }
  }


Рейтинг:
13

Graeme_Grant

Чтобы расширить свое решение Karthik Bangalore, Работа с JSON в C# и VB[^]- это статья CodeProject, написанная для таких вопросов, как этот. Он охватывает инструменты, включая генерацию кода, вспомогательные классы и полные рабочие образцы, которые можно загрузить и запустить.


Kingshuk_SP

Хорошая статья Грэм :) Спасибо и Ваше здоровье :)

Graeme_Grant

Добро пожаловать. Слишком много, чтобы писать здесь... Рад, что это помогло.

Рейтинг:
0

Member 13489209

Чтобы еще больше расширить решение Karthik Bangalore, вам не нужно использовать массив, когда List<t> доступен, поэтому вот что я бы сделал:

using Newtonsoft.Json;
using System.Collections.Generic;

namespace WorkingWithJson
{
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class Working_with_json
    {
        public static void DeserializeJSON()
        {
            // our json string
            string json = @"[{""Id"":1,""Name"":""name1""},{""Id"":2,""Name"":""name2""},{""Id"":3,""Name"":""name3""}]";
            
            // deserializing to a list of type Person
            List<Person> people = JsonConvert.DeserializeObject<List<Person>>(json);

            // which can then be retrieved thus
            System.Console.WriteLine($"{people[0].Id} - {people[0].Name}");
        }
    }
}