json и C#

  • Автор темы Автор темы wizard
  • Дата начала Дата начала

wizard

Client
Регистрация
04.10.2011
Сообщения
1 056
Реакции
720
Баллы
113
Подскажите можно ли из
Код:
Развернуть Свернуть Копировать
{"anketa":"userId":"id69033337","mes":"1","age":"20"}}
сразу одним C# снипетом - разложить по соответствующим переменным (userId, mes, age)
 
делай регулярками
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;
Можно также сериализовать.
 
Можно через 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
Так это вариант на c# и есть, через родную MS библиотеку, другие варианты - только написать свой парсер.
 
а можно еще вопрос ?
хочу все данные из json разложить в переменные ZP
Код:
Развернуть Свернуть Копировать
project.Variables["mes"].Value = d1["mes"].ToString();

как бы так сделать чтобы в project.Variables["mes"].Value имя переменной (mes) бралось из ключа json ??
 
а можно еще вопрос ?
хочу все данные из 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
один человек тут на форуме подкинул идею про парсилку джейсона прямо на странице. Если у вас шаблон с браузером. Можете попробовать что-то типа такого
это пример не из вашего случая и обьект десериализовывать не приходится, но я им пользуюсь и должен сказать что это лучше чем подключать либу. Единственное что может случиться плохое это - асинхронность джавика.
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
Если надо прям на странице отпарсить, тихо, лучше ипользовать JSON.
А чем плохо подключение либы ?
 
на примере выше джейсон был десереиализован в тип Dictionary, потому что по своей стурктуре сам джейсон совпадал с этим типом именно в примере. Если будет другой случай, то прийдется создавать свой собственный клас для десериализации, а зенка этого не может. Тогда прийдется создавать еще одну либу только ради одного класса.
другой случай с либой json.net. У них можна десериализовывать в уже подготовленные для этого дела стандартные классы.
Если есть браузер то гораздо быстрей и более наглядно можно работать с джаваскриптными обьектами и смотреть что получится.
 
  • Спасибо
Реакции: Sanekk
Мне пока не попадалось вариантов где-бы Dictionary не подошел, им можно распарсить джейсон любой вложенности, т.к. у нас значение кладется в объект, который мы потом уже приводим к нужному типу:
Dictionary - если это вложенная ветка
string, int и т.п. если это значение.

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

В браузере удобней однозначно, но из JS нельзя записывать в переменные проекта, надо городить вызовы JS из C#, обрабатывать результаты и затем записывать.
 
  • Спасибо
Реакции: LexxWork
понятно...
а если массив тo List<Dictionary<string, object>>
спасибо за информацию.
 
  • Спасибо
Реакции: Sanekk
Тоже столкнулись с проблемой разбора 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)
 
или с либой json.net - не важно, лишь бы в один сниппет
 
Для не вложенных 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
Посылаю лучи добра:dm:
 
Ещё мазок: есть переменная зенки "result" в которой содержится json, которую нужно заэкранировать.

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

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

Нужно снова через код как-то экранировать "внутренности". (действие "Подготовка JavaScript" не подходит так как экранит все кавычки, а нужно только "внутренности")
 
а вы подготовьте сначала переменные пост и cryMore а потом собирайте result
 
И снова хотелось бы универсальности. А если переменных будет 50, каждую обрабатывать - тяжко
 
а подскажите пожалуйста как вот такие данные запихнуть в таблицу
{"mes":[{"id":256},{"text":"текст1"},{"id":257},{"text":"текст2"},{"id":258},{"text":"текст3"},]}
чтоб 256 + текст1 и далее с новой строки 257 + текст2 и т.д.
 
егуяука
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
или может такой правильный формат
{"mes":{"id":["11111111","2222222222222","333333333"],"text":["текст1","текст2","текст3"]},"mes2":"000"}
что то я совсем запутался (
 
А как вы подключаете

System.Web.Script.Serialization.JavaScriptSerializer ?

У меня ругается, что нет такой либы.
 
System.Web.Extensions.dll в GAC попробуйте добавить
 
  • Спасибо
Реакции: codeby
Друзья подскажите плиз что делаю не так

имееться 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>>" невозможно

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

Код:
Развернуть Свернуть Копировать
List<Dictionary<string,object>> data = jsonser.Deserialize<List<Dictionary<string,object>>>(json);

при десериализации тоже надо указывать что это массив
 
  • Спасибо
Реакции: Sz5

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