Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
19 / 8 / 7
Регистрация: 26.12.2013
Сообщений: 167

Десериализация JSON из ВК без JSON.NET

05.03.2016, 13:12. Показов 3022. Ответов 8

Студворк — интернет-сервис помощи студентам
JSON:
Кликните здесь для просмотра всего текста
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{ "response" : [ 2,
      { "admin_level" : 3,
        "gid" : 51688792,
        "is_admin" : 1,
        "is_closed" : 0,
        "is_member" : 1,
        "name" : "Группа1",
        "photo" : "http://cs307513.vk.me/v307513088/8db3/GTohwCvAPBY.jpg",
        "photo_big" : "http://cs307513.vk.me/v307513088/8db1/pxa6-BHqz0Q.jpg",
        "photo_medium" : "http://cs307513.vk.me/v307513088/8db2/k73C9h2QM7A.jpg",
        "screen_name" : "group1",
        "type" : "group"
      },
      { "gid" : 51457152,
        "is_admin" : 0,
        "is_closed" : 0,
        "is_member" : 1,
        "name" : "Avito - сайт мошенник №1",
        "photo" : "http://cs417930.vk.me/v417930238/aa26/1TPkO-RUKdg.jpg",
        "photo_big" : "http://cs417930.vk.me/v417930238/aa24/e7WlUDIni2g.jpg",
        "photo_medium" : "http://cs417930.vk.me/v417930238/aa25/qBkV1ef1_gk.jpg",
        "screen_name" : "avitonetru",
        "type" : "group"
      }
    ] }


Мой код:
C#
1
2
3
4
string json = тут текст из спойлера вначале;
JavaScriptSerializer jser = new JavaScriptSerializer();
lGroup lgr = new lGroup();
lgr = jser.Deserialize<lGroup>(json);
Класс lGroup (+Group):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Group
    {
        public int gid { get; set; }
        public string name {get;set;}
        public string screen_name { get; set; }
        public int is_closed { get; set; }
        public string type { get; set; }
        public int is_admin { get; set; }
        public int admin_level { get; set; }
        public int is_member { get; set; }
        public string photo { get; set; }
        public string photo_medium { get; set; }
        public string photo_big { get; set; }
    }
 
    public class lGroup
    {
        public List<Group> groups { get; set; }
    }
В результате получаю
C#
1
lgr.groups=null;
Объясните, что делаю не так, почему lgr.groups.Count!=2
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2016, 13:12
Ответы с готовыми решениями:

Распарсить с помощью Json.Net приходящий ответ в виде JSON
Нужна помощь с json {&quot;success&quot;:true, &quot;rgInventory&quot;:{ &quot;1025429056&quot;:{ &quot;id&quot;:&quot;1025429056&quot;, &quot;classid&quot;:&quot;310779217&quot;,...

Json.NET не нравится json - Unexpected character encountered while parsing value
Ошибка при десерилизации такого вот текста: { &quot;ishavework&quot;: false, &quot;num&quot;: null, &quot;work&quot;: null } ...

[JSON.NET] Как десериализовать Json с меняющимеся ключами?
Имеется структура Json ответа вида: { field1: { &quot;2187d248-1a3b-35d0-a4ec-bead586ff547&quot; : { childField1:...

8
18 / 18 / 14
Регистрация: 02.01.2015
Сообщений: 78
05.03.2016, 15:08
Цитата Сообщение от depravity Посмотреть сообщение
без JSON.NET
Если вы не про Newtonsoft.Json, то посоветовал бы использовать его.
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,960
Записей в блоге: 216
05.03.2016, 16:02
Не вижу у вас ошибок. Для интереса попробовал, у меня работает. Вот что я сделал. Выполнил запрос:

C#
1
2
3
4
5
6
            using (var w = new WebClient())
            {
                w.Encoding = Encoding.UTF8;
                var json = await w.DownloadStringTaskAsync("https://api.vk.com/method/users.get?user_id=66748&v=5.45");
                // ...
            }

Получил в ответ Json. Выделил его. Выбрал в VS в меню: "EDIT" -> "Past Special" -> "Past JSON As Classes".

Сгенерился такой класс:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace GetJSON
{
    public class User
    {
        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 int hidden { get; set; }
    }
 
}


После приёма JSON десериализирую в User:

C#
1
User user = new JavaScriptSerializer().Deserialize<User>(json);
У меня на форме TextBox и Button. При нажатии на кнопку выводится "Oлег":
C#
1
textBoxOutput.Text += user.response[0].first_name;
Весь пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.ComponentModel;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Web.Script.Serialization;
 
namespace GetJSON
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            textBoxOutput.ScrollBars = ScrollBars.Both;
            textBoxOutput.WordWrap = false;
        }
 
        private async void buttonGetJSON_Click(object sender, EventArgs e)
        {
            buttonGetJSON.Enabled = false;
            await GetJSON();
 
        }
 
        private async Task GetJSON()
        {
            using (var w = new WebClient())
            {
                w.Encoding = Encoding.UTF8;
                var json = await w.DownloadStringTaskAsync("https://api.vk.com/method/users.get?user_id=66748&v=5.45");
 
                User user = new JavaScriptSerializer().Deserialize<User>(json);
 
                textBoxOutput.Text += user.response[0].first_name;
                buttonGetJSON.Enabled = true;
            }
        }
    }
}
1
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,960
Записей в блоге: 216
07.03.2016, 20:49
depravity, можно ещё использовать XML и System.Xml.Linq

Вот как я вывожу Имя и Фамилию:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
 
/*
<?xml version="1.0" encoding="utf-8"?>
<response list="true">
 <user>
  <id>66748</id>
  <first_name>Олег</first_name>
  <last_name>Илларионов</last_name>
  <hidden>1</hidden>
 </user>
</response>
*/
 
namespace GetXmlFromVk
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            textBoxOutput.ScrollBars = ScrollBars.Both;
            textBoxOutput.WordWrap = false;
        }
 
        private async void buttonGetXmlFromVk_Click(object sender, EventArgs e)
        {
            buttonGetXmlFromVk.Enabled = false;
            await GetXmlFromVk();
            buttonGetXmlFromVk.Enabled = true;
        }
 
        private async Task GetXmlFromVk()
        {
            using (var w = new WebClient())
            {
                w.Encoding = Encoding.UTF8;
                var resp = await w.DownloadStringTaskAsync("https://api.vk.com/method/users.get.xml?user_id=66748&v=5.45");
 
                XDocument xmlDoc = XDocument.Parse(resp);
 
                var query = from user in xmlDoc.Descendants("user")
                            select new User
                            {
                                Id = (int)user.Element("id"),
                                FirstName = user.Element("first_name").Value.ToString(),
                                LastName = user.Element("last_name").Value.ToString()
                            };
 
                foreach (var user in query)
                {
                    textBoxOutput.Text += user.FirstName + " " + user.LastName;
                }
            }
        }
    }
}
Добавлено через 18 часов 54 минуты
Цитата Сообщение от AlexDenton Посмотреть сообщение
Если вы не про Newtonsoft.Json, то посоветовал бы использовать его.
Оказывается JSON.NET и Newtonsoft.Json одно и тоже.

depravity, почему вы не хотите использовать Newtonsoft.Json?

Какой метод VkAPI вы использовали, чтобы получить такой ответ:
JSON
1
{"response":[2,{"gid":51688792,"name":"Группа1","screen_name":"group1","is_closed":0,"type":"group","is_admin":1,"admin_level":3,"is_member":1,"photo":"http:\/\/cs307513.vk.me\/v307513088\/8db3\/GTohwCvAPBY.jpg","photo_medium":"http:\/\/cs307513.vk.me\/v307513088\/8db2\/k73C9h2QM7A.jpg","photo_big":"http:\/\/cs307513.vk.me\/v307513088\/8db1\/pxa6-BHqz0Q.jpg"},{"gid":51457152,"name":"Avito - сайт мошенник №1","screen_name":"avitonetru","is_closed":0,"type":"group","is_admin":0,"is_member":1,"photo":"http:\/\/cs417930.vk.me\/v417930238\/aa26\/1TPkO-RUKdg.jpg","photo_medium":"http:\/\/cs417930.vk.me\/v417930238\/aa25\/qBkV1ef1_gk.jpg","photo_big":"http:\/\/cs417930.vk.me\/v417930238\/aa24\/e7WlUDIni2g.jpg"}]}
Я научился парсить JSON с помощью LINQ (using Newtonsoft.Json.Linq)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        private void buttonGetJSON_Click(object sender, EventArgs e)
        {
            var demo = @"{'pets': [{ 'name': 'Jeffrey', 'species': 'Giraffe'}, { 'name': 'Gustav', 'species': 'Dog'}, { 'name': 'Bruce', 'species': 'Duck'}]}";
 
            JObject json = JObject.Parse(demo);
 
            textBoxOutput.Text += json["pets"][0]["name"];
            textBoxOutput.Text += Environment.NewLine;
            textBoxOutput.Text += Environment.NewLine;
 
            JArray pets = (JArray)json["pets"];
            textBoxOutput.Text += pets[0]["name"];
            textBoxOutput.Text += Environment.NewLine;
            textBoxOutput.Text += Environment.NewLine;
 
            var query = from pet in pets
                        select new
                        {
                            Name = pet["name"],
                            Species = pet["species"]
                        };
 
            foreach (var pet in query)
            {
                textBoxOutput.Text += pet.Name + " " + pet.Species;
                textBoxOutput.Text += Environment.NewLine;
            }
        }
2
 Аватар для 1337trix
23 / 24 / 11
Регистрация: 04.12.2014
Сообщений: 422
07.03.2016, 22:27
Не знаю, актуально ли еще, или нет... но вот отличный материал, который мне помог при работе с JSON
Клик
0
19 / 8 / 7
Регистрация: 26.12.2013
Сообщений: 167
12.03.2016, 10:50  [ТС]
Гуглил гуглил и пришел к этому:
C#
1
2
3
4
5
6
7
8
public Grouo[] Groups(string user_id, string offset, string count, string token)
        {
            string url = "https://api.vk.com/method/groups.get?" + string.Format("user_id={0}&extended=1&offset={1}&count={2}&access_token={3}", user_id, offset, count, token);
            WebClient wc = new WebClient();
            wc.Encoding = Encoding.UTF8;
            string json = wc.DownloadString(url); json = json.Remove(json.Length - 1, 1).Remove(0, 14 + count.Length).Insert(0, "[");
            return new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Grouo[]>(json);
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Grouo
    {
        public int gid { get; set; }
        public string name { get; set; }
        public string screen_name { get; set; }
        public int is_closed { get; set; }
        public string type { get; set; }
        public int is_admin { get; set; }
        public int admin_level { get; set; }
        public int is_member { get; set; }
        public string photo { get; set; }
        public string photo_medium { get; set; }
        public string photo_big { get; set; }
    }
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,960
Записей в блоге: 216
12.03.2016, 13:22
depravity, в вашем коде есть проблемка: во время wc.DownloadString(url) ваша программа зависнет пока не будет получен ответ от сервера.

И ещё три замечания:
1) Метод groups.get не требует access_token. Лишний раз лучше обойтись без авторизации
2) Вместо WebClient можно использовать HttpClient. Можно погуглить что лучше и в каких ситуациях
3) У классов WebClient и HttpClient есть метода Despose, потому нужно его вызывать, например использовать блок using (Resource) {};
C#
1
2
3
4
using (HttpClient client = new HttpClient)
{
    // ...
}
Опять же парсить json гораздо удобнее с помощью json.net и linq.
0
19 / 8 / 7
Регистрация: 26.12.2013
Сообщений: 167
13.03.2016, 10:30  [ТС]
8Observer8 , да пусть зависает, у программы нет параллельных задач.

1) насколько я понял (по опыту), некоторые методы не требуют прав доступа (т.е. scope=""), но все требуют access_token (токен же это как идентификатор нужных прав, и то что прав нет, тоже нужно указать)
2) насчет этого погуглю. В общих чертах я так понимаю, что WebClient просто упрощенная штука, которая сама выполняет HttpRequest и HttpResponse'ы
3) это задача сборщика мусора же?
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,960
Записей в блоге: 216
13.03.2016, 11:42
Цитата Сообщение от depravity Посмотреть сообщение
да пусть зависает, у программы нет параллельных задач.
Есть ли у программы параллельные задачи или нет это вы решаете. Было бы правильно делать скачивание файлов параллельной задачей, чтобы можно было во время скачивания сворачивать/закрывать/перетаскивать. Да, просто неприятно видеть когда окно ни на что не реагирует. Это ваши выбор. Просто я высказал своё мнение, как лучше.

Цитата Сообщение от depravity Посмотреть сообщение
но все требуют access_token (токен же это как идентификатор нужных прав, и то что прав нет, тоже нужно указать)
Посмотрите мой первый пример, там нет access_token, значит он не нужен для данного метода.

Цитата Сообщение от depravity Посмотреть сообщение
3) это задача сборщика мусора же?
По этому поводу я мало знаю. Просто читал, что нужно в ручную вызывать Despose, если он есть у объекта, или использовать using. Не знаю к чему это может привести, если не вызывать. Надо будет поискать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.03.2016, 11:42
Помогаю со студенческими работами здесь

Десериализация JSON
Имеется ответ от сервера в Json { &quot;error_message&quot; : false, &quot;result&quot; : , &quot;status&quot; : 1, &quot;url&quot; :...

Десериализация Json
Есть следующий код JSON помогите сделать класс. response: { count: 146, items: , post_source: { type: 'vk' }, comments: {

Десериализация JSON
Есть JSON строка, получаю её по http запросу public class Account { public string Name { get; set;...

Десериализация json
Всем привет, следующая проблема возникла, имеется следующий json: {&quot;data&quot;: {&quot;user&quot;: {&quot;edge_followed_by&quot;: {&quot;count&quot;: 526,...

Десериализация JSON
Приветствую всех. Пытаюсь в C#. Решил попробовать в запросы и API. Начал с VK. Ну и тут сразу проблема. {&quot;response&quot;: Есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru