Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018

Не получается сохранить JSON в объект

03.12.2012, 01:27. Показов 3004. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
После запроса к API Вконтакте получаю ответ в формате 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{
    "response":
    [
        3,
        {
            "uid":13074987,
            "first_name":"Джоанна",
            "last_name":"Суходоля",
            "sex":1,
            "photo_50":"http:\/\/cs10174.userapi.com\/u13074987\/e_46a7c538.jpg",
            "online":0,
            "screen_name":"joannasukhodolya",
            "last_seen":
            {
                "time":1354459908
            }
        },
        {
            "uid":14463821,
            "first_name":"Ирина",
            "last_name":"Безпалько",
            "sex":1,
            "photo_50":"http:\/\/cs315331.userapi.com\/v315331821\/1ca7\/Q8C14l_2kaA.jpg",
            "online":0,
            "screen_name":"id14463821",
            "last_seen":
            {
                "time":1354460631
            }
        },
        {
            "uid":44984544,
            "first_name":"Вероніка",
            "last_name":"Семенюк",
            "sex":1,
            "photo_50":"http:\/\/cs6126.userapi.com\/v6126544\/c9e\/K55EW1X1rlA.jpg",
            "online":1,
            "screen_name":"id44984544",
            "last_seen":
            {
                "time":1354472175
            }
        }
    ]
}
Здесь отображается количество пользователей (3 штуки) и сами пользователи.
Мне из этого JSON нужно сохранить в коллекцию, которая содержит объекты типа FaveUser. Использую библиотеку JSON.NET. Количество пользователей в коллекцию вытянул, но не получается передать в конструктор FaveUser каждого пользователя по отдельности. Вылетает исключение, что в качестве индекса нужно указывать имя, а не индекс. Но какое здесь имя указывать, если с самого JSON прекрасно видно, что здесь хранится коллекция пользователей, где каждый объект-пользователь не имеет имени, по которому я б смог к нему обратиться! Вот уже второй час бъюсь, пробовал и так и сяк, все никак не получается вытянуть пользователей. Помогите увидеть ошибку.

Вот пытаюсь в конструкторе создать коллекцию...
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
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
 
namespace VkAPITest
{
    class FaveUsers : Dictionary<string, FaveUser>
    {
        public readonly int Count;
 
        public FaveUsers(string strJson)
        {
 
            JObject json = JObject.Parse(strJson); //парсим JSON в объект
            JToken response = json["response"]; //получаем вложенный объект, который содержит два объекта: количество пользователей и коллекцию пользователей
            Count = (int)response[0]; //получаем количество пользователей
            JToken jUsers = response[1]; //получаем коллекцию пользователей
            
            for (int i = 0; i < Count; i++) //проходимся по JSON-колеекции пользователей
            {
                var jUser = jUsers[i]; //здесь вылетает ArgumentException - Accessed JObject values with invalid key value: 0. Object property name expected.
                FaveUser currentUser = new FaveUser(jUser);
                this.Add(currentUser.ID, currentUser);
            }
        }
    }
}
Сам тип FaveUser:
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
using System;
using Newtonsoft.Json.Linq;
 
namespace VkAPITest
{
    class FaveUser
    {
        public readonly string FirstName;
        public readonly string LastName;
        public readonly SexType Sex;
        public readonly string ID;
        public readonly string Photo50;
        public readonly bool IsOnline;
        public readonly string ScreenName;
        public readonly DateTime LastSeen;
 
        public FaveUser(JToken jtUser)
        {
            ID = (string)jtUser["uid"];
            //и присовение всех остальных полей...
        }
 
        public enum SexType
        {
            NotSpecified,
            Male,
            Female
        }
    }
}
Вот передаю в конструктор JSON-строку:
C#
1
2
strJson = "{\"response\":[3,{\"uid\":13074987,\"first_name\":\"Джоанна\",\"last_name\":\"Суходоля\",\"sex\":1,\"photo_50\":\"http:\\/\\/cs10174.userapi.com\\/u13074987\\/e_46a7c538.jpg\",\"online\":0,\"screen_name\":\"joannasukhodolya\",\"last_seen\":{\"time\":1354459908}},{\"uid\":14463821,\"first_name\":\"Ирина\",\"last_name\":\"Безпалько\",\"sex\":1,\"photo_50\":\"http:\\/\\/cs315331.userapi.com\\/v315331821\\/1ca7\\/Q8C14l_2kaA.jpg\",\"online\":0,\"screen_name\":\"id14463821\",\"last_seen\":{\"time\":1354460631}},{\"uid\":44984544,\"first_name\":\"Вероніка\",\"last_name\":\"Семенюк\",\"sex\":1,\"photo_50\":\"http:\\/\\/cs6126.userapi.com\\/v6126544\\/c9e\\/K55EW1X1rlA.jpg\",\"online\":1,\"screen_name\":\"id44984544\",\"last_seen\":{\"time\":1354472175}}]}";
FaveUsers faveUsers = new FaveUsers(strJson);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.12.2012, 01:27
Ответы с готовыми решениями:

Не получается прочитать json
доброго времени суток. столкнулся с такой проблемой, не могу спарсить значения с json. как не пытался не получается.. success: True...

Как сохранить в файл не сериализуемый объект?
Получаю из сторонней библиотеки объект который хотел сохранять между сессиями при помощи бинарной сериализации, но тип объекта не помечен...

Json.NET: какой объект надо создать, что бы десериализировать строку
Работаю с VK.Api. Получаю ответ в виде JSON. Для десериализация JSON строки в объект использую JSON.NET(Info). В общем, не могу понять...

3
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.12.2012, 17:37
У вас ошибка вот в этом:
Цитата Сообщение от Tolias28 Посмотреть сообщение
получаем вложенный объект, который содержит два объекта: количество пользователей и коллекцию пользователей
Вы получаете объект (корневой элемент), который содержит массив response, в котором первый элемент - количество, а все последующие элементы - объекты.
То есть изменить надо как-то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    class FaveUsers : Dictionary<string, FaveUser>
    {
        public readonly int Count;
 
        public FaveUsers(string strJson)
        {
 
            JObject json = JObject.Parse(strJson); //парсим JSON в объект
            JToken response = json["response"]; //получаем вложенный объект, который содержит два объекта: количество пользователей и коллекцию пользователей
            Count = (int)response[0]; //получаем количество пользователей
            
            for (int i = 1; i <= Count; i++) //проходимся по JSON-колеекции пользователей
            {
                var jUser = response[i];
                FaveUser currentUser = new FaveUser(jUser);
                this.Add(currentUser.ID, currentUser);
            }
        }
    }
Я либой JSON.NET не сильно пользовался, потому вышеприведенный код наверняка нерабочий, но суть, думаю, передает.

Кстати, для работы с REST-интерфейсами очень рекомендую библиотеку RestSharp - крайне удобная штука.
Говорят, с .NET 4.5 она теряет актуальность, но я все еще пишу на .NET 4.0.
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
03.12.2012, 22:56  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Вы получаете объект (корневой элемент), который содержит массив response, в котором первый элемент - количество, а все последующие элементы - объекты
Спасибо! Понял причину. Вот так теперь работает:
C#
1
2
3
4
5
6
7
8
            JObject json = JObject.Parse(strJson); //парсим JSON в объект
            JArray jArr = (JArray)json["response"];
            Count = (int)jArr[0];
            for (int i = 1; i <= Count; i++) //проходимся по JSON-колеекции пользователей
            {
                FaveUser currentUser = new FaveUser(jArr[i]);
                this.Add(currentUser.ID, currentUser);
            }
Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Кстати, для работы с REST-интерфейсами очень рекомендую библиотеку RestSharp - крайне удобная штука.
Спасибо. Но здесь вроде REST-интерфейсы не используются, если я не ошибаюсь. Или вы не конректно об этом примере?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.12.2012, 23:17
Цитата Сообщение от Tolias28 Посмотреть сообщение
здесь вроде REST-интерфейсы не используются, если я не ошибаюсь.
Я не знаю что вконтакт использует, но вот твиттер и фэйсбук, к примеру, используют REST.
Думал, что вконтактик и это позаимствовал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.12.2012, 23:17
Помогаю со студенческими работами здесь

Можно ли сохранить объект в памяти между запросами?
Есть объект который получает данные из БД и файлов, которые нужны практически для всех страниц сайта, данные крайне редко обновляются. ...

Десериализация JSON дает пустой объект
Здравствуйте, пишу приложение для получения погоды. Данные получаю из сервиса openweathermap в виде json. json я получаю нормально, нужно...

Ошибка преобразования json строки в объект C#
Не обращайте внимание , что все свойства типа string , это я потом поменяю. public class OrderBook { public string...

Парсинг Json строки в объект и массив
{ &quot;json&quot;: }, { &quot;tovar&quot;: } ] } string js = &quot;{ &quot;json&quot; : },{ &quot;tovar&quot; : } ]...

Преобразовать JSON строку в объект типа dynamic
Доброго времени суток уважаемые! Столкнулся с банальной задачей: преобразовать JSON строку в объект типа dynamic. Первым делом,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru