Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.66/35: Рейтинг темы: голосов - 35, средняя оценка - 4.66
3 / 3 / 3
Регистрация: 23.09.2013
Сообщений: 48
1

Как получить из JSON только нужные параметры?

19.05.2014, 09:15. Показов 7320. Ответов 7
Метки нет (Все метки)

Проблема в том, что сервис выдает JSON не в читабельном формате, без переноса строк и т.д (пример ниже),а просто сплошной строкой, поэтому разбить на <key,value> не получается, но как то же можно распарсить эти данные. Нужны четыре параметра title, subid1, createdAtTime и profit.
И конечно, строка может содержать массив данных любого размера. То есть (title, subid1, createdAtTime и profit) параметры не в единичном экземпляре, а их может быть сколько угодно.


JSON
1
{"status":200,"error":"","data":{"statsCount":3,"statsRequest":{"dayFrom":20140508,"dayTo":20140508},"statsType":"leads","stats":[{"id":1012127480694,"status":{"id":2,"title":"Отменен"},"profit":600,"createdAtTime":1399556704,"createdAtDate":"08.05.2014 17:45:04","lead":{"time":1399556704,"date":"08.05.2014 17:45:04","ip":"178.141.36.229","useragent":"Mozilla\/5.0 (Windows NT 5.1; rv:12.0) Gecko\/20100101 Firefox\/12.0"},"click":{"time":1399556531,"date":"08.05.2014 17:42:11","ip":"178.141.36.229","useragent":"Mozilla\/5.0 (Windows NT 5.1; rv:12.0) Gecko\/20100101 Firefox\/12.0"},"link":{"id":344222,"title":"Директ линк"},"subid1":"422108893","subid2":null,"offer":{"id":1034,"title":"Товары почтой: «Power Balance» - энергетический браслет"},"goal":{"id":1492,"title":"Подтвержденная заявка (Россия)"},"geo":{"country":"Россия","city":"Киров","region":"Кировская область"}},{"id":1012127516502,"status":{"id":2,"title":"Отменен"},"profit":600,"createdAtTime":1399570998,"createdAtDate":"08.05.2014 21:43:18","lead":{"time":1399570998,"date":"08.05.2014 21:43:18","ip":"46.158.141.68","useragent":"Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.131 Safari\/537.36"},"click":{"time":1399570916,"date":"08.05.2014 21:41:56","ip":"46.158.141.68","useragent":"Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.131 Safari\/537.36"},"link":{"id":344222,"title":"Директ линк"},"subid1":"422122859","subid2":null,"offer":{"id":1034,"title":"Товары почтой: «Power Balance» - энергетический браслет"},"goal":{"id":1492,"title":"Подтвержденная заявка (Россия)"},"geo":{"country":"Россия","city":"Краснодар","region":"Краснодарский край"}},{"id":1012127519017,"status":{"id":2,"title":"Отменен"},"profit":600,"createdAtTime":1399572928,"createdAtDate":"08.05.2014 22:15:28","lead":{"time":1399572928,"date":"08.05.2014 22:15:28","ip":"91.76.255.41","useragent":"Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.132 Safari\/537.36 OPR\/21.0.1432.57"},"click":{"time":1399572915,"date":"08.05.2014 22:15:15","ip":"91.76.255.41","useragent":"Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.132 Safari\/537.36 OPR\/21.0.1432.57"},"link":{"id":344222,"title":"Директ линк"},"subid1":"422131765","subid2":null,"offer":{"id":1034,"title":"Товары почтой: «Power Balance» - энергетический браслет"},"goal":{"id":1492,"title":"Подтвержденная заявка (Россия)"},"geo":{"country":"Россия","city":"Москва","region":"Москва"}}]},"docs":"API documentation located at http:\/\/developers.ad1.ru\/network\/v1\/WmStats"}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2014, 09:15
Ответы с готовыми решениями:

JSON получить нужные параметры
Ответ сервера { &quot;results&quot;:, &quot;info&quot;:{ &quot;seed&quot;:&quot;cb4b6bd1b687ebd0&quot;, ...

Как получить нужные параметры?
Хочу парсить сайт. Через fiddler отслеживаю пакеты, которые отправляет мой браузер. Но я заметил,...

Как получить список файлов в архиве и извлечь только нужные
Подскажите плиз, как получить список файлов в архиве и извлеч только нужные мне файлы в папку. ...

Как из JSON строки получить только одно значение?
есть ответ от сервера {&quot;code&quot;:0,&quot;code&quot;:&quot;OK&quot;} я успешно смог это спарсить с помощью JObject.Parse,...

7
985 / 883 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
19.05.2014, 09:17 2
Эм, что значит распарсить не получается? Если бы оно Вам с переносами выдало, что бы Вы делать стали?

Добавлено через 51 секунду
На заметку, представьте себе, что любая программа на C#, пусть даже в миллион строк тоже может быть представлена одной строкой... и компилятору как-то всё равно будет.
0
3 / 3 / 3
Регистрация: 23.09.2013
Сообщений: 48
19.05.2014, 09:30  [ТС] 3
Суть в том, что до этого я парсил данные в словарь по "\r\n", а в этой строке нет этих символов.

код который смог.
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
66
public static Dictionary<string, string> ParseJson(string res)
        {
            var lines = res.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            var ht = new Dictionary<string, string>(20);
            var st = new Stack<string>(20);
 
            for (int i = 0; i < lines.Length; ++i)
            {
                var line = lines[i];
                var pair = line.Split(":".ToCharArray(), 2, StringSplitOptions.RemoveEmptyEntries);
 
                if (pair.Length == 2)
                {
                    var key = ClearString(pair[0]);
                    var val = ClearString(pair[1]);
 
                    if (val == "{")
                    {
                        st.Push(key);
                    }
                    else
                    {
                        if (st.Count > 0)
                        {
                            key = string.Join("_", st) + "_" + key;
                        }
 
                        if (ht.ContainsKey(key))
                        {
                            ht[key] += "&" + val;
                        }
                        else
                        {
                            ht.Add(key, val);
                        }
                    }
                }
                else if (line.IndexOf('}') != -1 && st.Count > 0)
                {
                    st.Pop();
                }
            }
 
            return ht;
        }
 
        static string ClearString(string str)
        {
            str = str.Trim();
 
            var ind0 = str.IndexOf("\"");
            var ind1 = str.LastIndexOf("\"");
 
            if (ind0 != -1 && ind1 != -1)
            {
                str = str.Substring(ind0 + 1, ind1 - ind0 - 1);
            }
            else if (str[str.Length - 1] == ',')
            {
                str = str.Substring(0, str.Length - 1);
            }
 
            str = System.Net.WebUtility.HtmlDecode(str);
 
            return str;
        }
Добавлено через 7 минут
Цитата Сообщение от Spawn Посмотреть сообщение
Эм, что значит распарсить не получается?
А может использовать Newtonsoft.Json? вы не пользовались?
0
985 / 883 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
19.05.2014, 09:34 4
Ну, круто, Вы пытались вручную распарсить JSON
Либо Newtonsoft.Json, либо Json.NET, либо что-то там встроенное в .NET, но не рекомендую
1
Master of Orion
Эксперт .NET
6080 / 4936 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.05.2014, 11:26 5
https://gist.github.com/LodewijkSioen/5101814
1
3 / 3 / 3
Регистрация: 23.09.2013
Сообщений: 48
19.05.2014, 16:52  [ТС] 6
По итогу отпишусь, вдруг кто-то столкнется, и да, спасибо тем кто откликнулся.
Решил проблему несколько проще, без лишних сборок. Создал класс, который мапит структуру JSON объекта и вызвал:
C#
1
2
3
4
5
using System.Runtime.Serialization.Json;  
.....
DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(WmStats));
string _dataForSerializing = sd.GET_http(@"http://api.ad1.ru/v1/WmStats/?key=83f64e37b4d257fce4a877a67549e36b2c49ecbd129960&dayFrom=20140508&dayTo=20140508&type=leads");
WmStats _wmStat = (WmStats)json.ReadObject(new System.IO.MemoryStream(Encoding.UTF8.GetBytes(_dataForSerializing)));
map 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
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
66
67
68
69
70
71
72
73
74
75
76
77
public class WmStats
    {
        public int status { get; set; }
        public string error { get; set; }
        public Data data { get; set; }
        public string docs { get; set; }
 
        public class Data
        {
            public int statsCount { get; set; }
            public StatsRequest statsRequest { get; set; }
            public string statsType { get; set; }
            public Stats[] stats { get;set;}
        }
        public class StatsRequest
        {
            public string dayFrom {get;set;}
            public string dayTo {get;set;}
        }
        public class Stats
        {
            public string id { get; set; }
            public Status status { get; set; }
            public double profit { get;set;}
            public string createdAtTime { get;set;}
            public string createdAtDate { get;set;}
            public Lead lead {get;set;}
            public Click click {get;set;}
            public Link link {get;set;}
            public string subid1 {get;set;}
            public string subid2 {get;set;}
            public Offer offer {get;set;}
            public Goal goal {get;set;}
            public Geo geo { get; set; }
        }
        public class Status
        {
             public int id { get; set; }
             public string title{get;set;}
        }
        public class Lead
        {
            public string time { get; set; }
            public string date{ get; set; }
            public string ip{ get; set; }
            public string useragent { get; set; }
                
        }
        public class Click
        {
            public string time { get; set; }
            public string date { get; set; }
            public string ip { get; set; }
            public string useragent { get; set; }
        }
        public class Link
        {
            public int id { get; set; }
            public string title { get; set; }
        }
        public class Offer
        {
            public int id { get; set; }
            public string title { get; set; }
        }
        public class Goal
        {
            public int id { get; set; }
            public string title { get; set; }
        }
        public class Geo
        {
            public string country { get; set; }
            public string city { get; set; }
            public string region { get; set; }
        }
    }
0
Spawn
19.05.2014, 16:56
  #7

Не по теме:

Цитата Сообщение от ChristmasSocks Посмотреть сообщение
Решил проблему несколько проще, без лишних сборок. Создал класс, который мапит структуру JSON объекта и вызвал:
Это то самое родное решение, которое я не стал упоминать всуе :)

0
3 / 3 / 3
Регистрация: 23.09.2013
Сообщений: 48
19.05.2014, 17:01  [ТС] 8
Цитата Сообщение от Spawn Посмотреть сообщение
Это то самое родное решение
я кстати так и подумал
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2014, 17:01

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как распарсить строку JSON и получить оттуда только одно значение?
Сервер возвращает мне длинную JSON строку. Из нее мне нужно вытащить только ID. Я сделал так: ...

Как передать в URL нужные параметры
День добрый форумчане! Кто знает как можно передать нужные запросы через URL адрес с нужными...

Как вывести нужные данные из JSON используя PHP
мне надо достать то что содержится в message. { &quot;data&quot;: , &quot;paging&quot;: { ...

Как получить из строки JSON токен используя JSON.NET?
Доброго времени суток, Господа. Поскажите пожалуйста. Я никогда не работал с JSON. Вот тут решил...

Получить JSON и передать все его параметры его в Intent. Использован автофильтр
Всем привет. Я тут запутался, помогите разобраться. Стоит задача выполнить такой функционал:...

Как вывести только нужные посты?
Добрый день У меня есть такой код: $args = array( 'post_parent' =&gt; $post-&gt;ID,...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.