C# WinForms — Как правильно парсить json?

288
01 июня 2017, 06:05

Пишу программу с VK Api, делал GET запрос, далее возникли проблемы с парсингом json. Когда запускаю программу ничего не отображается... Вот код:

public class Account
    {
        public string id { get; set; }
        public string first_name { get; set; }
        public string last_name { get; set; }
        public string bdate { get; set; }
    }
private void Example_Load(object sender, EventArgs e)
    {
        var client = new WebClient();
        using (var stream = client.OpenRead("https://api.vk.com/method/users.get?user_ids=210700286&fields=bdate&v=5.64"))
        using (var sr = new StreamReader(stream))
        {
            var text = sr.ReadToEnd();
            Account m = JsonConvert.DeserializeObject<Account>(text);
            textBox1.Text = m.id;
            textBox1.Text += " ";
            textBox1.Text += m.first_name;
            textBox1.Text += " ";
            textBox1.Text += m.last_name;
            textBox1.Text += " ";
            textBox1.Text += m.bdate;
        }
    }

В чём проблема? За ранее огромное спасибо

Answer 1

Ваш запрос возвращает следующий JSON:

{"response":[{"id":210700286,"first_name":"Lindsey","last_name":"Stirling","bdate":"21.9.1986"}]}

Он не совпадает с вашим классом Account.

Если скопировать его в буфер обмена и выполнить в Visual Studio команду меню Edit > Paste Special > Paste JSON As Classes, то будут сгенерированы следующие классы:

public class Rootobject
{
    public Response[] response { get; set; }
}
public class Response
{
    public int id { get; set; }
    public string first_name { get; set; }
    public string last_name { get; set; }
    public string bdate { get; set; }
}

Становится понятно, что возвращается объект, содержащий массив данных о пользователях.

Следующий код должен работать:

var root = JsonConvert.DeserializeObject<Rootobject>(text);
foreach (var response in root.response)
    Console.WriteLine(response.id + " " + response.first_name +
        " " + response.last_name + " " + response.bdate);

Желательно названия классов и свойств привести к общепринятым в C# стандартам и сделать их более осмысленными:

[JsonObject("Rootobject")]
public class Response
{
    [JsonProperty("response")]
    public Account[] Accounts { get; set; }
}
[JsonObject("Response")]
public class Account
{
    [JsonProperty("id")]
    public int Id { get; set; }
    [JsonProperty("first_name")]
    public string FirstName { get; set; }
    [JsonProperty("last_name")]
    public string LastName { get; set; }
    [JsonProperty("bdate")]
    public string BirthDate { get; set; }
}
var response = JsonConvert.DeserializeObject<Response>(text);
foreach (var account in response.Accounts)
    Console.WriteLine(account.Id + " " + account.FirstName +
        " " + account.LastName + " " + account.BirthDate);
READ ALSO
Как, сортируя один массив в случайном порядке, отсортировать еще один в точно таком же порядке?

Как, сортируя один массив в случайном порядке, отсортировать еще один в точно таком же порядке?

Сортирует значения какого-нибудь List в случайном порядкеА как сделать так, чтобы List2 отсортировался в точно таком же порядке?

271
Окно входа steam на С#

Окно входа steam на С#

Подскажите где найти тему интерфейса в стиле Steam для WindowsForms, обрыл весь интернет, но не нашел ничего годного

229
Привязка DataGrid к коллекции коллекций

Привязка DataGrid к коллекции коллекций

Есть датагрид к которому нужно биндить коллекцию из класса вью модели которая сама является составной из нескольких однотипных коллекций...

207
Не выполняется подготовленный запрос

Не выполняется подготовленный запрос

Почему нельзя выполнить команду

224