json и C#

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113
Подскажите можно ли из
Код:
{"anketa":"userId":"id69033337","mes":"1","age":"20"}}
сразу одним C# снипетом - разложить по соответствующим переменным (userId, mes, age)
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
делай регулярками
C#:
var str = Project.Variables["ВходнаяСтрока"].Value;
var userId = Regex.Match(str,"(?<=\"userId\":\").+?(?=\")").Value;
var mes = Regex.Match(str,"(?<=\"mes\":\").+?(?=\")").Value;
var age = Regex.Match(str,"(?<=\"age\":\").+?(?=\")").Value;
Можно также сериализовать.
 

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Можно через JavaScriptSerializer, только сначала надо в GAC подключить System.Web.Extentions.dll

Для вашего случая, код будет выглядеть так:
Код:
string json_str = "{\"anketa\":{\"userId\":\"id69033337\",\"mes\":\"1\",\"age\":\"20\"},\"anketa1\":\"test\"}";
var json_serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
Dictionary<string,object> dict = json_serializer.Deserialize<Dictionary<string,object>>(json_str);
Dictionary<string,object> d1 = (Dictionary<string,object>)dict["anketa"];
var userid = d1["userId"];
var mes = d1["mes"];
var age = d1["age"];
 
  • Спасибо
Реакции: wizard и Radzhab

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Так это вариант на c# и есть, через родную MS библиотеку, другие варианты - только написать свой парсер.
 

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113
а можно еще вопрос ?
хочу все данные из json разложить в переменные ZP
Код:
project.Variables["mes"].Value = d1["mes"].ToString();
как бы так сделать чтобы в project.Variables["mes"].Value имя переменной (mes) бралось из ключа json ??
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
а можно еще вопрос ?
хочу все данные из json разложить в переменные ZP
Код:
project.Variables["mes"].Value = d1["mes"].ToString();
как бы так сделать чтобы в project.Variables["mes"].Value имя переменной (mes) бралось из ключа json ??

Код:
foreach( string s in d1.Keys )
{
project.Variables[s].Value = d1[s];
}
 
  • Спасибо
Реакции: wizard

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
791
Баллы
113
один человек тут на форуме подкинул идею про парсилку джейсона прямо на странице. Если у вас шаблон с браузером. Можете попробовать что-то типа такого
это пример не из вашего случая и обьект десериализовывать не приходится, но я им пользуюсь и должен сказать что это лучше чем подключать либу. Единственное что может случиться плохое это - асинхронность джавика.
C#:
string jsdata = instance.ActiveTab.MainDocument.EvaluateScript("var data = '';var cls = linkone.jsviewer.metadata[0].Callouts;for (var i= 0; i < cls.length; i++){data += cls[i].DisplayItemId+','+Math.round(cls[i].Position.X)+','+Math.round(cls[i].Position.Y)+';';} return data;");
потом я сплитю jsdata на блоки аж пока не доберусь до нужных мне элементов.
 
  • Спасибо
Реакции: Sanekk

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Если надо прям на странице отпарсить, тихо, лучше ипользовать JSON.
А чем плохо подключение либы ?
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
791
Баллы
113
на примере выше джейсон был десереиализован в тип Dictionary, потому что по своей стурктуре сам джейсон совпадал с этим типом именно в примере. Если будет другой случай, то прийдется создавать свой собственный клас для десериализации, а зенка этого не может. Тогда прийдется создавать еще одну либу только ради одного класса.
другой случай с либой json.net. У них можна десериализовывать в уже подготовленные для этого дела стандартные классы.
Если есть браузер то гораздо быстрей и более наглядно можно работать с джаваскриптными обьектами и смотреть что получится.
 
  • Спасибо
Реакции: Sanekk

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Мне пока не попадалось вариантов где-бы Dictionary не подошел, им можно распарсить джейсон любой вложенности, т.к. у нас значение кладется в объект, который мы потом уже приводим к нужному типу:
Dictionary - если это вложенная ветка
string, int и т.п. если это значение.

json.net хорошая либа, но ее надо отдельно ставить, а JavaScriptSerializer входит в NET, нам его надо только подключить.

В браузере удобней однозначно, но из JS нельзя записывать в переменные проекта, надо городить вызовы JS из C#, обрабатывать результаты и затем записывать.
 
  • Спасибо
Реакции: LexxWork

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
791
Баллы
113
понятно...
а если массив тo List<Dictionary<string, object>>
спасибо за информацию.
 
  • Спасибо
Реакции: Sanekk

up_lvl

Client
Регистрация
02.09.2014
Сообщения
131
Благодарностей
53
Баллы
28
Тоже столкнулись с проблемой разбора json'a по переменным, чтоб было более-менее универсально и в одном сниппете.

В переменную Zenno 'tableParse' приходит json вида:

Код:
{"account_login":"79647106765","account_password":"tkKHOXLsq","proxy":"192.71.25.245:8888"}
Необходимо распаршивать всё по переменным, чтоб в переменную account_login записалось 79647106765 и так далее. Проекты разные, задача в общем-то вышкребать значения из {"variable_1":"value_1","variable_2":"value2","variable_n":"value_n"} по соответсвующим переменным зенки (variable_1, variable_2, variable_n)

Помогите плз с решением используя JavaScriptSerializer (System.Web.Extentions.dll)
 

up_lvl

Client
Регистрация
02.09.2014
Сообщения
131
Благодарностей
53
Баллы
28
или с либой json.net - не важно, лишь бы в один сниппет
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Для не вложенных JSON подойдет такой сниппет:
PHP:
string json_str = project.Variables["tableParse"].Value;
var json_serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
Dictionary<string,object> dict = json_serializer.Deserialize<Dictionary<string,object>>(json_str);
foreach( string s in dict.Keys ){
    project.Variables[s].Value = (string)dict[s];
}
return 1;
 
  • Спасибо
Реакции: up_lvl

up_lvl

Client
Регистрация
02.09.2014
Сообщения
131
Благодарностей
53
Баллы
28
Посылаю лучи добра:dm:
 

up_lvl

Client
Регистрация
02.09.2014
Сообщения
131
Благодарностей
53
Баллы
28
Ещё мазок: есть переменная зенки "result" в которой содержится json, которую нужно заэкранировать.

Переменная result слеплена из кусков других переменных: {"post:"{-Variable.post-}","cry":"{-Variable.cryMore-}" в этих переменных (post, cryMore) могут быть спец. символы или встретиться кавычки.

Код:
{"post":"превед я обычная переменная без кавычек и распарсилась бы норм если б не cryMore-сосед ","cryMore":"превед, я захотел вставить "Заголовок" и кучу "спец.символов" ^%$#@(_)!"}
Нужно снова через код как-то экранировать "внутренности". (действие "Подготовка JavaScript" не подходит так как экранит все кавычки, а нужно только "внутренности")
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
а вы подготовьте сначала переменные пост и cryMore а потом собирайте result
 

up_lvl

Client
Регистрация
02.09.2014
Сообщения
131
Благодарностей
53
Баллы
28
И снова хотелось бы универсальности. А если переменных будет 50, каждую обрабатывать - тяжко
 

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113
а подскажите пожалуйста как вот такие данные запихнуть в таблицу
{"mes":[{"id":256},{"text":"текст1"},{"id":257},{"text":"текст2"},{"id":258},{"text":"текст3"},]}
чтоб 256 + текст1 и далее с новой строки 257 + текст2 и т.д.
 

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113
эээ наверно некорректные данные дал
{"mes":[{"id":"256","text":"текст1"},{"id":"257","text":"текст2"}]}
вот так вроде лучше
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
791
Баллы
113
егуяука
C#:
string json = project.Variables["json"].Value;
var table =  project.Tables["table"];

List<string> id_list = System.Text.RegularExpressions.Regex.Matches(json, "(?<=id\":\").*?(?=\")").Cast<System.Text.RegularExpressions.Match>().Select(v=>v.Value).ToList<string>();
List<string> text_list = System.Text.RegularExpressions.Regex.Matches(json, "(?<=text\":\").*?(?=\")").Cast<System.Text.RegularExpressions.Match>().Select(v=>v.Value).ToList<string>();

lock(SyncObjects.TableSyncer){
    for(int i=0; i<id_list.Count; i++)
        table.AddRow(new List<string> {id_list[i], text_list[i]});
}
жисон диcииаазеу
C#:
string json = project.Variables["json"].Value;
var table =  project.Tables["table"];

var json_serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
Dictionary<string,object> mes = json_serializer.Deserialize<Dictionary<string,object>>(json);
var list = (System.Collections.ArrayList)mes["mes"];
lock(SyncObjects.TableSyncer){
    foreach (var item in list){
        string id = (string)((Dictionary<string, object>)(item))["id"];
        string text = (string)((Dictionary<string, object>)(item))["text"];
        table.AddRow(new List<string> {id, text});
    }
}
 
  • Спасибо
Реакции: wizard и Adigen

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113
или может такой правильный формат
{"mes":{"id":["11111111","2222222222222","333333333"],"text":["текст1","текст2","текст3"]},"mes2":"000"}
что то я совсем запутался (
 

wizard

Client
Регистрация
04.10.2011
Сообщения
1 004
Благодарностей
632
Баллы
113

codeby

Client
Регистрация
25.08.2014
Сообщения
394
Благодарностей
53
Баллы
28
А как вы подключаете

System.Web.Script.Serialization.JavaScriptSerializer ?

У меня ругается, что нет такой либы.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
System.Web.Extensions.dll в GAC попробуйте добавить
 
  • Спасибо
Реакции: codeby

system2

Client
Регистрация
21.04.2010
Сообщения
57
Благодарностей
15
Баллы
8
Друзья подскажите плиз что делаю не так

имееться json
Код:
[{
    "_id": "57664ce92b7f045521c8be6f",
    "lang": "ru",
    "__v": 0,
    "status": 1,
        "timeZone": "{\"utc\":[\"Europe/Moscow\",\"Europe/Samara\",\"Europe/Simferopol\",\"Europe/Volgograd\"],\"text\":\"(UTC+04:00)Moscow,St.Petersburg,Volgograd\",\"isdst\":false,\"offset\":4,\"abbr\":\"RST\",\"value\":\"RussianStandardTime\"}",
    "dateCreate": "2016-06-19T07:42:33.323Z",
    "body": "<span style=\"line-height: 20px;\">Доброго дня main, в вашей структуре появился новый партнер: bot.</span>\n\t\t\t\t\t\t\t\t\t\t",
    "messenger": "Viber",
    "username": "main",
    "fio": "main main",
    "phone": "+380995098098"
}, {
    "_id": "57695ccfbf19ead7727da258",
    "lang": "ru",
    "__v": 0,
    "status": 0,
        "timeZone": "{\"utc\":[\"Europe/Moscow\",\"Europe/Samara\",\"Europe/Simferopol\",\"Europe/Volgograd\"],\"text\":\"(UTC+04:00)Moscow,St.Petersburg,Volgograd\",\"isdst\":false,\"offset\":4,\"abbr\":\"RST\",\"value\":\"RussianStandardTime\"}",
    "dateCreate": "2016-06-21T15:27:11.609Z",
    "body": "<p>Здравствуйте&nbsp;&nbsp;main, к Вашей структуре зарегистрировались [summa_new_users] человек.</p>\n\n<p>Поздравляю Вас!</p>",
    "messenger": "Viber",
    "username": "main",
    "fio": "main main",
    "phone": "+380995098098"
}]
Пытаюсь десереализовать в массив

Код:
var json = project.Variables["MessageQueue"].Value;
var jsonser = new System.Web.Script.Serialization.JavaScriptSerializer();

List<Dictionary<string,object>> data = jsonser.Deserialize<Dictionary<string,object>>(json);
Неявное преобразование типа
"System.Collections.Generic.Dictionary<string,object>" в
"System.Collections.Generic.List<System.Collections.Generic.Dictionary<string,object>>" невозможно

Как вообще подобные массивы десереализуют? Помогите плиз.
 
Последнее редактирование:

system2

Client
Регистрация
21.04.2010
Сообщения
57
Благодарностей
15
Баллы
8
разобрался, спасибо

Код:
List<Dictionary<string,object>> data = jsonser.Deserialize<List<Dictionary<string,object>>>(json);
при десериализации тоже надо указывать что это массив
 
  • Спасибо
Реакции: Sz5

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)