Форум программистов, компьютерный форум, киберфорум
C#: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499

Десериализовать JSON VK API

07.08.2014, 08:16. Показов 4760. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот недавно решил сделать приложение для контакта, однако столкнулся с трудностью(не я один, судя по гуглу): ответ от сервера приходит, а нормально десериализовать json в .net у меня не получается, нагуглить не удалось толком ничего

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
26
27
28
29
30
31
32
response: {
count: 114494175,
items: [{
id: 141109685,
owner_id: 56091049,
artist: 'Loreen',
title: 'Euphoria',
duration: 181,
url: 'http://cs9-1v4.vk...763c0d2eae117.mp3 ',
lyrics_id: 23109031,
album_id: 9200275,
genre_id: 18
}, {
id: 160382897,
owner_id: 29113248,
artist: 'PSY',
title: 'OPPA, GANGNAM STYLE!',
duration: 219,
url: 'http://cs9-6v4.vk...44d5582a1ccb7.mp3 ',
lyrics_id: 26530229,
genre_id: 18
}, {
id: 161108801,
owner_id: 46472596,
artist: 'Ярмак',
title: 'Сердце пацана',
duration: 229,
url: 'http://cs9-5v4.vk...58cb2e1485baf.mp3 ',
lyrics_id: 27276241,
genre_id: 18
}]
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[DataContract]
    class VK_info
    {
        [DataMember(Name = "aid")]
        public Int32 Aid {get; set;}
        [DataMember(Name = "owner_id")]
        public Int32 Owner_id {get; set;}
        [DataMember(Name = "artist")]
        public string Artist {get; set;}
        [DataMember(Name = "title")]
        public string Title {get; set;}
        [DataMember(Name = "duration")]
        public Int32 Duration {get; set;}
        [DataMember(Name = "url")]
        public string Url {get; set;}
        [DataMember(Name = "lyrics_id")]
        public Int32 Lyrics_id {get; set;}
        [DataMember(Name = "album_id")]
        public Int32 Album_id {get; set;}
        [DataMember(Name = "genre")]
        public Int32 Genre_id { get; set; }
    }
мой кусок кода на c# не дающий вывода названия песен в листбокс:
C#
1
2
3
DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(VK_info));
VK_info VK_resp = (VK_info)json.ReadObject(new System.IO.MemoryStream(Encoding.UTF8.GetBytes(VKresponce)));
MusicList.Items.Add(VK_resp.Title);
помогите кто чем может
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.08.2014, 08:16
Ответы с готовыми решениями:

Json десериализация vk api
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Json.net and vk api response object
response: Все перепробовал

VK API метод newsfeed.get (Newtonsoft.Json и xNet)
Есть такая функция, с помощью ее хочу получить 100 последних новостей группы с ID "-23138673" public static string...

14
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
07.08.2014, 09:14
tapochka, С DataContractJsonSerializer у меня тоже как-то не сложилось. Слишком он какой-то привередливый.

Кликните здесь для просмотра всего текста
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
65
class Program
{
    public static void Main()
    {
        var source = @"{
        response: {
        count: 114494175,
        items: [{
        id: 141109685,
        owner_id: 56091049,
        artist: 'Loreen',
        title: 'Euphoria',
        duration: 181,
        url: 'http://cs9-1v4.vk...763c0d2eae117.mp3 ',
        lyrics_id: 23109031,
        album_id: 9200275,
        genre_id: 18
        }, {
        id: 160382897,
        owner_id: 29113248,
        artist: 'PSY',
        title: 'OPPA, GANGNAM STYLE!',
        duration: 219,
        url: 'http://cs9-6v4.vk...44d5582a1ccb7.mp3 ',
        lyrics_id: 26530229,
        genre_id: 18
        }, {
        id: 161108801,
        owner_id: 46472596,
        artist: 'Ярмак',
        title: 'Сердце пацана',
        duration: 229,
        url: 'http://cs9-5v4.vk...58cb2e1485baf.mp3 ',
        lyrics_id: 27276241,
        genre_id: 18
        }]
        }}";
        var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        var resObj = serializer.Deserialize<VK_Result>(source);
    }
}
 
public class VK_Result
{
    public VK_Response response { get; set; }
 
    public class VK_Response
    {
        public List<VK_info> items { get; set; }
        public int count { get; set; }
 
        public class VK_info
        {
            public Int32 Id { get; set; }
            public Int32 Owner_Id { get; set; }
            public string Artist { get; set; }
            public string Title { get; set; }
            public Int32 Duration { get; set; }
            public string Url { get; set; }
            public Int32 Lyrics_Id { get; set; }
            public Int32 Album_Id { get; set; }
            public Int32 Genre_Id { get; set; }
        }
    }
}


Обратите внимание, я обернул JSON текст в фигурные скобки, ибо куда отнести "response" я так и не понял.
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
07.08.2014, 21:38  [ТС]
Честно говоря не получилось пока что вашим способом

Я неправильно слегка json привел сначала:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@{"response":
     [  151042,
             {"aid":81906027,
    "owner_id":1174645,
    "artist":"Abba",
    "title":"Happy New Year",
    "duration":264,
    "url":"http:\/\/cs9-3v4.vk.me\/p19\/0f315a...T2sStE",
    "lyrics_id":"5331876",
    "album":"42213739",
    "genre":18 },
            {"aid":88828240,
    "owner_id":251278,
    "artist":"Abba",
    "title":"Dancing Queen",
    "duration":232,
    "url":"http:\/\/cs5000.vk.me\/u251278\/audio...b4wiZQ",
    "lyrics_id":"6839315",
    "genre":2}
     ]
 }
делаю так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class VK_Responce
    {
        public List<VK_info> response { get; set; } 
 
            public class VK_info
            {
                public Int32 Aid { get; set; }
                public Int32 Owner_Id { get; set; }
                public string Artist { get; set; }
                public string Title { get; set; }
                public Int32 Duration { get; set; }
                public string Url { get; set; }
                public Int32 Lyrics_Id { get; set; }
                public Int32 Album_Id { get; set; }
                public Int32 Genre { get; set; }
            }
        
    }
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var resObj = serializer.Deserialize<VK_info>(VKresponce);
Ругается на последнюю строку
возможно класс VK_Responce неправильно организовал
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
09.08.2014, 08:38  [ТС]
В общем так и продолжает выдавать "Недопустимый примитив JSON: ."
ну я думал, что это, возможно, из-за добавления бэкслэшей в ссылки... убрал все бэкслэши в ответе с помощью string.replace; и все равно продолжает выдавать то же самое(
и VK_Responce другой сделал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class VK_Responce
    {
 //       public List<VK_info> Response { get; set; } 
        public Dictionary<Counter_Json, VK_info> Response { get; set; }
 
        public class Counter_Json
        {
            public Int32 Count { get; set; }
        }
            public class VK_info
            {
                public Int32 Aid { get; set; }
                public Int32 Owner_Id { get; set; }
                public string Artist { get; set; }
                public string Title { get; set; }
                public Int32 Duration { get; set; }
                public Uri Url { get; set; }
                public Int32 Lyrics_Id { get; set; }
                public Int32 Album_Id { get; set; }
                public Int32 Genre { get; set; }
            }
        
    }
и все равно ничего не помогает...
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
09.08.2014, 10:36
Лучший ответ Сообщение было отмечено tapochka как решение

Решение

json

JavaScript
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
{
  "response":
    [
      {
        "aid":81906027,
        "owner_id":1174645,
        "artist":"Abba",
        "title":"Happy New Year",
        "duration":264,
        "url":"http:\/\/cs9-3v4.vk.me\/p19\/0f315a...T2sStE",
        "lyrics_id":"5331876",
        "album":"42213739",
        "genre":18
      },
      {
        "aid":88828240,
        "owner_id":251278,
        "artist":"Abba",
        "title":"Dancing Queen",
        "duration":232,
        "url":"http:\/\/cs5000.vk.me\/u251278\/audio...b4wiZQ",
        "lyrics_id":"6839315",
        "genre":2
      }
    ]
 }

Описание одного элемента

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
internal class VkMusic
{
    [JsonProperty("aid")]
    public int Id { get; set; }
 
    [JsonProperty("owner_id")]
    public int OwnerId { get; set; }
 
    [JsonProperty("artist")]
    public string Artist { get; set; }
 
    [JsonProperty("title")]
    public string Title { get; set; }
 
    [JsonProperty("duration")]
    public int Duration { get; set; }
 
    [JsonProperty("url")]
    public string Url { get; set; }
 
    [JsonProperty("lyrics_id")]
    public int LyricsId { get; set; }
 
    [JsonProperty("album")]
    public int AlbumId { get; set; }
 
    [JsonProperty("genre")]
    public int Genre { get; set; }
}

Описание ответа

C#
1
2
3
4
5
internal class VkResponse
{
    [JsonProperty("response")]
    public List<VkMusic> Musics { get; set; }
}


Использование:
C#
1
2
string json = File.ReadAllText("response.txt");
var response = JsonConvert.DeserializeObject<VkResponse>(json);
Для работы необходимо в проект добавить библиотеку Newstone.Json.

Добавлено через 1 минуту
Цитата Сообщение от tapochka Посмотреть сообщение
Я неправильно слегка json привел сначала
В этом варианте представлен неправильный json.

Добавлено через 17 минут
Глянул что там за json:
JSON
1
2
3
4
5
{
response: {
count: 6,
items: [{
...
Явно не то, что у тебя.
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
10.08.2014, 04:48  [ТС]
Преогромнейшее спасибо!
однако проблема снова: ума не приложу почему вылетает NullReferenceException когда в обработчике события клика кнопки пишу
C#
1
2
3
var Vkresponse = new VkResponse();
for (int i = 0; i < Vkresponse.Musics.Count; i++)
MusicList.Items.Add(Vkresponse.Musics[i].Artist.ToString());
для вывода исполнителей в листбокс. Отладчик показывает, что десериализированные объекты нулю не равны... помогите, всю ночь сижу

з.ы. а json у меня реально приходил такой какой я приводил... сам не знаю почему
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
10.08.2014, 09:51
tapochka, смотри:
В первой строчки создаешь класс:
C#
1
var Vkresponse = new VkResponse();
А в следующей сразу начинаешь использовать:
C#
1
for (int i = 0; i < Vkresponse.Musics.Count; i++)
У тебя список Musics = null.
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
10.08.2014, 20:44  [ТС]
мда... стыдно, что сам не заметил, благодарствую
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 7
22.03.2015, 15:50
tapochka, дико извиняюсь =) но может прога с кодом осталась??
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
22.03.2015, 16:32  [ТС]
idoctor, осталась, там на wpf, но дико кривое все... сейчас бы конечно так уже не делал бы; надо полностью или кусок с десериализацией?
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 7
22.03.2015, 16:36
tapochka, меня именно десериализация интересует и создание листа
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
22.03.2015, 16:55  [ТС]
вот такой вот кошмар:

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
namespace SaveMusicVk
{
internal class VkResponse
    {
        [JsonProperty("response")]
        public List<VkMusic> Musics { get; set; }
    }
 
    internal class VkMusic
    {
        [JsonProperty("aid")]
        public int Id { get; set; }
 
        [JsonProperty("owner_id")]
        public int OwnerId { get; set; }
 
        [JsonProperty("artist")]
        public string Artist { get; set; }
 
        [JsonProperty("title")]
        public string Title { get; set; }
 
        [JsonProperty("duration")]
        public int Duration { get; set; }
 
        [JsonProperty("url")]
        public string Url { get; set; }
 
        [JsonProperty("lyrics_id")]
        public int LyricsId { get; set; }
 
        [JsonProperty("album")]
        public int AlbumId { get; set; }
 
        [JsonProperty("genre")]
        public int Genre { get; set; }
    }
 
    internal class ResponseItems
    {
        public string Artist { get; set; }
        public string Title { get; set; }
        public string Duration_int { get; set; }
        public string Id { get; set; }
        public string Link { get; set; }
    }
}
и в кодбехайнде к основному окну:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using Newtonsoft.Json;
 
 
var Vkmusic = new VkMusic();
var Vkresponse = new VkResponse();
 
try
{
         var response = JsonConvert.DeserializeObject<VkResponse>(VKresponse);
         for (int i = 0; i < response.Musics.Count; i++)
         {
          Int32[] Minutes = new Int32[response.Musics.Count];
          Int32[] Seconds = new Int32[response.Musics.Count];
          Seconds[i] = (response.Musics[i].Duration) % 60;
          Minutes[i] = (response.Musics[i].Duration - Seconds[i]) / 60;
          ResponseItems.Add(new ResponseItems { Artist = response.Musics[i].Artist, Title = response.Musics[i].Title, Duration_int = Minutes[i].ToString() + ":" + Seconds[i], Id=response.Musics[i].Id.ToString(), Link=response.Musics[i].Url});
          }
          MusicList.ItemsSource = ResponseItems;
}
catch { System.Windows.MessageBox.Show("введите меньшее количество песен"); }
сразу могу сказать, что из-за того, что в названиях песен в вк содержатся ковычки, запятые и т.д., то иногда json будет десериализовать проблематично
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 7
22.03.2015, 23:19
tapochka, ооо спасибо =) еще такой вопрос... [JsonProperty("...")] это что и как получить?? потому что подключил все библиотеки Newtonsoft.Json и все равно ругается на эту строку =/
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
23.03.2015, 00:31  [ТС]
ну это аттрибут
https://msdn.microsoft.com/ru-... 10%29.aspx
добавить нужно
C#
1
using Newtonsoft.Json;
в файле где первый кусок кода я скинул(namespace SaveMusicVk)
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 7
23.03.2015, 13:20
tapochka, всеее, разобрался =) сделал чуть иначе =) спасибо =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.03.2015, 13:20
Помогаю со студенческими работами здесь

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

Десериализовать JSON
Помогите десериализовать JSON. Нужны id и name из quests var json = { &quot;obj&quot;:{&quot;order&quot;:, &quot;quests&quot;:{ ...

Десериализовать JSON
Здравствуйте, помогите десериализовать: ...

Десериализовать JSON
Здравствуйте, подскажите, как десериализовать данный JSON. string users =...

Десериализовать JSON
Добрый вечер. Подскажите как правильно создать класс для десериализации вот такого jsona.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru