Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/75: Рейтинг темы: голосов - 75, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 14

Json-парсер, есть ли готовые библиотеки

05.12.2011, 02:28. Показов 15969. Ответов 28

Студворк — интернет-сервис помощи студентам
Здравствуйте, товарищи.
Помогите разобраться с такой задачей:
Есть вот такая штука:
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
{
"data": [
   { "index": "0", 
     "serviceClass": "Эконом", 
      "prices": [3075,70,80], 
      "eTicketing": true, 
      "segments": [
            { "indexSegment": "0", 
               "stopsCount": "0", 
               "flights": [
                     { "index": "0", 
                        "time": 
                        "PT2H", 
                        "minAvailSeats": "4", 
                        "flightLegs": [
                               { "flightNo": "138", 
                                  "eTicketing": true, 
                                  "airplane": "Boeing 737", 
                                  "airline": "Кубань", 
                                  "airlineCode": "GW", 
                                  "from": {
                                            "code": "VKO", 
                                            "airport": "Внуково", 
                                            "city": "Москва", 
                                            "country": "Россия", 
                                            "countryCode": "RU", 
                                            "terminal": ""}, 
                                  "to": {
                                             "code": "KRR", 
                                             "airport": "Пашковская", 
                                             "city": "Краснодар", 
                                             "country": "Россия", 
                                             "countryCode": "RU", 
                                             "terminal": ""}, 
                        "fromDate": "2012-01-04", 
                        "fromTime": "08:10:00", 
                        "toDate": "2012-01-04", 
                        "toTime": "10:10:00", 
                        "flightClass": "ECONOMY", 
                        "fareBasis": "SSXOW", 
                        "availSeats": 4, 
                        "classCode": "S" 
                  }], 
"stops": [] }] }] }]}

и таких констукций внутри data штук этак 40,
Подскажите каким образом достать из всего этого добра значение ну скажем prices , city , ну никак не получается...
Я пробую использовать JSON.Net, получается только для простеньких конструкций , например так:
easy json
C#
1
2
3
4
5
6
7
8
9
    private void button1_Click(object sender, EventArgs e)
        {
        string json =  @"{
                        ""index"": ""0"", ""serviceClass"": ""Эконом""
                         }";
            JObject o = JObject.Parse(json);
            string index = (string)o["index"];
            MessageBox.Show(index);
        }

но что делать с этой огромной конструкцией не пойму... может быть подскажете другую библиотеку для такой задачки , желательно немного объяснив как это сделать.
Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.12.2011, 02:28
Ответы с готовыми решениями:

Сокеты. Есть ли готовые библиотеки для построения на их основе клиент серверного ПО?
Обязательное условие, чтобы можно было без проблем взаимодействовать с такими серверами из других языков, конкретно с Java и С++. Для...

Визуализировать топологию - есть ли готовые библиотеки
Привет. У меня есть нейронная сеть, мне надо ее нарисовать. Все сводится к нарисованию обычного графа, с кружочками, соединенными линиями....

Есть ли готовые библиотеки на С++ с алгоритмами кластеризации?
Всем доброго времени суток. Не могли бы вы, мужики, подсказать, есть ли готовые библиотеки на С++ с алгоритмами кластеризации. Я слышал про...

28
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
13.11.2015, 02:55
Студворк — интернет-сервис помощи студентам
json .net + http://json2csharp.com и на выходе получается как то так
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
JsonData.cs
 
using System.Collections.Generic;
 
 
namespace ConsoleApplication3.Logic
{
    public class LastSeen
    {
        public int time { get; set; }
        public int platform { get; set; }
    }
 
    public class User
    {
        public int uid { get; set; }
        public string first_name { get; set; }
        public string last_name { get; set; }
        public int sex { get; set; }
        public string domain { get; set; }
        public string bdate { get; set; }
        public int city { get; set; }
        public int country { get; set; }
        public int has_mobile { get; set; }
        public int can_post { get; set; }
        public int can_see_all_posts { get; set; }
        public int can_see_audio { get; set; }
        public int can_write_private_message { get; set; }
        public string site { get; set; }
        public string status { get; set; }
        public LastSeen last_seen { get; set; }
        public string deactivated { get; set; }
    }
 
    public class Response
    {
        public int count { get; set; }
        public List<User> users { get; set; }
    }
 
    public class RootObject
    {
        public Response response { get; set; }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ConsoleApplication3.Logic;
using Newtonsoft.Json;
 
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            var json = File.ReadAllText("data.json");
            var rootObject = JsonConvert.DeserializeObject<RootObject>(json);
        }
    }
}
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,032
Записей в блоге: 1
13.11.2015, 03:15
VoltDeMar, по моему не хватает корневого объекта и преобразователь даты нужно свой писать. У тебя указан IsoDateTimeConverter. Это неправильно т.к. дата в этом формате это строка вида 2015-11-01T15:00:35Z. У тебя же похоже число секунд. У тебя похоже используется unix time.
конвертер даты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class UnixDateTimeConverter : DateTimeConverterBase
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }
 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var seconds = (long)reader.Value;
        return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(seconds);
    }
 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

Классы для десерилизации (сделаны с помощью json2csharp.com)
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
public class LastSeen
{
    [JsonConverter(typeof(UnixDateTimeConverter))]
    public DateTime time { get; set; }
    public int platform { get; set; }
}
 
public class User
{
    public int uid { get; set; }
    public string first_name { get; set; }
    public string last_name { get; set; }
    public int sex { get; set; }
    public string domain { get; set; }
    public string bdate { get; set; }
    public int city { get; set; }
    public int country { get; set; }
    public int has_mobile { get; set; }
    public int can_post { get; set; }
    public int can_see_all_posts { get; set; }
    public int can_see_audio { get; set; }
    public int can_write_private_message { get; set; }
    public string site { get; set; }
    public string status { get; set; }
    public LastSeen last_seen { get; set; }
}
 
public class Response
{
    public int count { get; set; }
    public List<User> users { get; set; }
}
 
public class RootObject
{
    public Response response { get; set; }
}

C#
1
RootObject r = JsonConvert.DeserializeObject<RootObject>(json);
2
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
24.11.2015, 00:11
В чем тут ошибся?
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
        //{"error":{"error_code":7,"error_msg":"Permission to perform this action is denied",
        //"request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"messages.send"},
        //{"key":"user_id","value":"469209"},{"key":"message","value":"Z draw stWuy!"}]}}
 
        public class error
        {
            public int error_code
            {  get; set; }
                        
            public string error_msg
            {  get; set; }
 
            public Request_Params request_rarams
            { get; set; }
        }
 
        public class Request_Params
        {
            public string key
            { get; set; }
 
            public string value
            { get; set; }
        }
Каков принцип иерархии элементов когда такое как тут в request_params? Если класс может содержать последовательность из пар элементов?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,032
Записей в блоге: 1
24.11.2015, 11:46
VoltDeMar, конструкция вида "request_params":[{...},{...}] означает массив объектов. Объект Request_Params у тебя уже объявлен. Нужно только объявить свойство request_params как массив.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
string json = "{"error":{"error_code":7,"error_msg":"Permission to perform this action is denied" +
"",\r\n"request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"messa" +
"ges.send"},\r\n{"key":"user_id","value":"469209"},{"key":"message","value":"Z draw" +
" stWuy!"}]}}";
var error = JsonConvert.DeserializeObject<root>(json);
// ...
public class root
{
    public error error { get; set; }
}
 
public class error
{
    public int error_code {  get; set; }
    public string error_msg {  get; set; }
    public Request_Params[] request_params { get; set; }
}
 
public class Request_Params
{
    public string key { get; set; }
    public string value { get; set; }
}
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
24.11.2015, 14:51
Что то идет не так, null возвращает.

А как написать если ответ может быть разным?
Миниатюры
Json-парсер, есть ли готовые библиотеки  
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,032
Записей в блоге: 1
24.11.2015, 15:13
VoltDeMar, думаю не хватает корневого объекта (см. мой пример). Плюс у тебя опечатка в имени request_rarams.
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
24.11.2015, 20:02
Цитата Сообщение от VoltDeMar Посмотреть сообщение
А как написать если ответ может быть разным?
Если может быть ответ error, a может быть responce и внутренняя структура у них разная?
0
 Аватар для MicM
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
24.11.2015, 21:24
Там на странице есть список библиотек
http://json.org
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18417 / 14348 / 5371
Регистрация: 17.03.2014
Сообщений: 29,032
Записей в блоге: 1
24.11.2015, 21:54
VoltDeMar, можно проверять имя первого объекта и на этом основании выбирать тип для десериализации:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
JsonTextReader jreader = new JsonTextReader(new StringReader(json));
if (jreader.Read() && jreader.TokenType == JsonToken.StartObject && jreader.Read() && jreader.TokenType == JsonToken.PropertyName)
{
    if (jreader.Value == "error")
    {
        var error = JsonConvert.DeserializeObject<ErrorObject>(json);
    }
    else if (jreader.Value == "response")
    {
        var response = JsonConvert.DeserializeObject<ResponseObject>(json);
    }
}
jreader.Close();
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2015, 21:54

Интерактивный журнал: с чего начать и есть ли готовые библиотеки?
Всем привет! кто имеет опыт разработки интерактивного журнала, подскажите с чего начать, куда копать, может есть на примете готовые...

Статистический анализ текста на PHP - есть ли готовые библиотеки?
Мои приветствия! Может встречал кто готовые PHP-библиотеки для статистического анализа текстов? Например, посчитать сколько раз...

Есть ли готовые универсальные парсеры-фреймворки или парсеры-библиотеки?
Есть ли готовые универсальные парсеры-фреймворки или парсеры-библиотеки?

Какие есть библиотеки для парсинга JSON?
Какие есть библиотеки для парсинга JSON в СИ++??

Есть ли библиотеки для работы с JSON полноценно поддерживающие JSONPath?
Delphi Rio. Понадобилось работать с JSON. Подключил System.JSON, работаю, предварительные результаты положительные. Но нюанс в том, что...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru