borbos
Интересующийся
Offline
|
|
« : 25-02-2014 23:12 » |
|
Приветствую. Есть на cpan модуль для парсинга json-а - JSON, до поры до времени все было нормально. Но, вот, немного изменился формат присылаемых данных - в json стал встречаться русский тест, теперь парсер спотыкается. Что делать??? {"pid":91294,"status":"SUCCESS","frameUrl":"","isMobile":false,"uaVersion":34,"uaFamilyName":"Chrome","osName":"Windows XP","countryId":21825,"region":"Киев","city":"Киев","keywords":"","district":"Центральная Украина","counterUrl":null,"matchUrl":null,"ads":[{"format":"popup","showLogo":false,"trackShowUri":"/_t=impr&itck=25nDoQ5CUWcp7IqT_XC01V2rbs7I-BrwaMZVk1gnoaNkT9mQa20i-OhuC_bgwIVgEionsyIQ6tHbPJfeuATmslLArvbR6CpUUo3r_r86jCgs5hwxvJwM2bmz3u2xNmEt_NgM0Sw4nKUmCFvbJHZhTl7MRCj6OlVmDivRDCvpY65n7Swn-PrpH3Wzp4lkoYpvd6jlm0Mov_1voulKdCMdzWUljeGB-eY3I02XlzI7z1mbHhkAK_oly_tZdb7nIvhy8mbEvWcSxy2_yoWeLPDxI7kh0Zzh_3hLBgnHGNc3Dyq_N9QQTHFbjuN-N9giG3HnVEu7D3phaM4UVv5cCdFFLxGs8BW6u5FBCmIinLCZ8tXOx00CQNyB7r0rJM9vjwJt-sA","clickUri":"/?t=clk&ctck=25m9bWYqUuf5sTaSy_4aygLoeNuxnMG7LgFi5MHjOIY0bsomIwAwwnuxYOGsUtRD7hwz8C_RAZajxqpUCB4eizrMfpuTYOmbS5rzwodpPpAY-A3sIndO1PmZGmuOD04DHTpbtrqDAUftb091O2VMXV2As05HW3HpZCisnwjCDLgBTSJWzmaUm1SetYi4BWE8on81ATJBOyLXHSp7-XJw80uZi1nI6pyod3f5OU-ZRfgspdsQ8wB6rJBGPrLIqrzMnk1dPT82nti1oBG7SgwN7_9NzvfHbb3H_uxa5dBPeh4M2fs3dArKnEgif0nFzTtfFq_cucuqQeN_v6XiETIqSg1XoJ11BYyHifhayniDzsqEAnVKTVe9_y49awBxduJejg","trackingDomain":"http://owners.central-processing.info","impDomain":"http://ruhc.about-home.info","blockId":null,"period":"1","limit":"10","width":"240","height":"400","src":"/2/5/b/25b8906fd4bf15bfe59bb4a8d5308715.gif","stubSrc":null,"headerUrl":null,"headerText":null,"closeUri":"/?t=ppund&ctck=25m9bWYqUuf5sTaSy_4aygLoeNuxnMG7LgFi5MHjOIY0bsomIwAwwnuxYOGsUtRD7hwz8C_RAZajxqpUCB4eizrMfpuTYOmbS5rzwodpPpAY-A3sIndO1PmZGmuOD04DHTpbtrqDAUftb091O2VMXV2As05HW3HpZCisnwjCDLgBTSJWzmaUm1SetYi4BWE8on81ATJBOyLXHSp7-XJw80uZi1nI6pyod3f5OU-ZRfgspdsQ8wB6rJBGPrLIqrzMnk1dPT82nti1oBG7SgwN7_9NzvfHbb3H_uxa5dBPeh4M2fs3dArKnEgif0nFzTtfFq_cucuqQeN_v6XiETIqSg1XoJ11BYyHifhayniDzsqEAnVKTVe9_y49awBxduJejg"}],"aframeUrl":""}
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #1 : 26-02-2014 04:05 » |
|
Перед парсингом конвертировать текст в ANSI. Он скорее всего в UTF8 на входе...
|
|
|
Записан
|
while (8==8)
|
|
|
Sla
|
|
« Ответ #2 : 26-02-2014 08:42 » |
|
Это неправильный json формат
По крайней мере utf-8 должно быть кодированым.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
borbos
Интересующийся
Offline
|
|
« Ответ #3 : 26-02-2014 15:28 » |
|
Странно, я думал, что для JSON utf8 это родной формат. А данные и правда приходят в utf8, причем, если нет русских символов, то все отлично, в противном случае, парсер спотыкается на русских словах и дальше не идет.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #4 : 26-02-2014 15:36 » |
|
Да, родной вот браузер получает \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 А то что у тебя - увы - подобие - соблюден только формат данных
|
|
« Последнее редактирование: 26-02-2014 15:40 от Sla »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 26-02-2014 20:50 » |
|
borbos, снова та же проблема: внимательно читай документацию! http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pmОбъектный вариант позволяет очень многое. Я предпочитаю JSON::XS, как несравненно более быстрый. Кроме того, полезно знать о внутреннем представлении строк в Perl. Например тот факт, что они имеют кодировку. Также открытые файлы и т.п. имеют свою кодировку. Внимательно почитай мануал модуля Encode.
|
|
« Последнее редактирование: 26-02-2014 20:54 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
borbos
Интересующийся
Offline
|
|
« Ответ #6 : 27-02-2014 00:47 » |
|
Да разобрался вроде как уже, спасибо. Кстати, как вытащить значение из массива json, что то не получается, возвращает хэш какой то. Хотя дата дампером вытаскивается нормально.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 27-02-2014 06:07 » |
|
Кстати, как вытащить значение из массива json
Какого? , что то не получается, возвращает хэш какой то
Какой? . Хотя дата дампером вытаскивается нормально.
Каким? Как? Извини, хрустальный шар куда-то закатился...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
borbos
Интересующийся
Offline
|
|
« Ответ #8 : 27-02-2014 16:03 » |
|
Сорри, туплю. Парсим массив в формате json #/usr/lib/perl -w
use JSON; use Data::Dumper;
$dat = '[{"format":"popup","showLogo":false,"trackShowUri":"/_t=impr&itck=25nDoQ5CUWcp7IqT_XC01V2rbs7I-BrwaMZVk1gnoaNkT9mQa20i-OhuC_bgwIVgEionsyIQ6tHbPJfeuATmslLArvbR6CpUUo3r_r86jCgs5hwxvJwM2bmz3u2xNmEt_NgM0Sw4nKUmCFvbJHZhTl7MRCj6OlVmDivRDCvpY65n7Swn-PrpH3Wzp4lkoYpvd6jlm0Mov_1voulKdCMdzWUljeGB-eY3I02XlzI7z1mbHhkAK_oly_tZdb7nIvhy8mbEvWcSxy2_yoWeLPDxI7kh0Zzh_3hLBgnHGNc3Dyq_N9QQTHFbjuN-N9giG3HnVEu7D3phaM4UVv5cCdFFLxGs8BW6u5FBCmIinLCZ8tXOx00CQNyB7r0rJM9vjwJt-sA","clickUri":"/?t=clk&ctck=25m9bWYqUuf5sTaSy_4aygLoeNuxnMG7LgFi5MHjOIY0bsomIwAwwnuxYOGsUtRD7hwz8C_RAZajxqpUCB4eizrMfpuTYOmbS5rzwodpPpAY-A3sIndO1PmZGmuOD04DHTpbtrqDAUftb091O2VMXV2As05HW3HpZCisnwjCDLgBTSJWzmaUm1SetYi4BWE8on81ATJBOyLXHSp7-XJw80uZi1nI6pyod3f5OU-ZRfgspdsQ8wB6rJBGPrLIqrzMnk1dPT82nti1oBG7SgwN7_9NzvfHbb3H_uxa5dBPeh4M2fs3dArKnEgif0nFzTtfFq_cucuqQeN_v6XiETIqSg1XoJ11BYyHifhayniDzsqEAnVKTVe9_y49awBxduJejg","trackingDomain":"http://owners.central-processing.info","impDomain":"http://ruhc.about-home.info","blockId":null,"period":"1","limit":"10","width":"240","height":"400","src":"/2/5/b/25b8906fd4bf15bfe59bb4a8d5308715.gif","stubSrc":null,"headerUrl":null,"headerText":null,"closeUri":"/?t=ppund&ctck=25m9bWYqUuf5sTaSy_4aygLoeNuxnMG7LgFi5MHjOIY0bsomIwAwwnuxYOGsUtRD7hwz8C_RAZajxqpUCB4eizrMfpuTYOmbS5rzwodpPpAY-A3sIndO1PmZGmuOD04DHTpbtrqDAUftb091O2VMXV2As05HW3HpZCisnwjCDLgBTSJWzmaUm1SetYi4BWE8on81ATJBOyLXHSp7-XJw80uZi1nI6pyod3f5OU-ZRfgspdsQ8wB6rJBGPrLIqrzMnk1dPT82nti1oBG7SgwN7_9NzvfHbb3H_uxa5dBPeh4M2fs3dArKnEgif0nFzTtfFq_cucuqQeN_v6XiETIqSg1XoJ11BYyHifhayniDzsqEAnVKTVe9_y49awBxduJejg"}]';
print decode_json($dat); # возвращает ARRAY(0x348ae4) Теперь выведем данные с помощью модуля Data::Dumper print Dumper(decode_json($dat)); Получим данные в виде $VAR1 = [ { 'width' => '240', 'blockId' => undef, 'clickUri' => '/?t=clk&ctck=25m9bWYqUuf5sTaSy_4aygLoeNuxnMG7LgFi5MHj OIY0bsomIwAwwnuxYOGsUtRD7hwz8C_RAZajxqpUCB4eizrMfpuTYOmbS5rzwodpPpAY-A3sIndO1PmZ GmuOD04DHTpbtrqDAUftb091O2VMXV2As05HW3HpZCisnwjCDLgBTSJWzmaUm1SetYi4BWE8on81ATJB OyLXHSp7-XJw80uZi1nI6pyod3f5OU-ZRfgspdsQ8wB6rJBGPrLIqrzMnk1dPT82nti1oBG7SgwN7_9N zvfHbb3H_uxa5dBPeh4M2fs3dArKnEgif0nFzTtfFq_cucuqQeN_v6XiETIqSg1XoJ11BYyHifhayniD zsqEAnVKTVe9_y49awBxduJejg', 'trackShowUri' => '/_t=impr&itck=25nDoQ5CUWcp7IqT_XC01V2rbs7I-BrwaMZ Vk1gnoaNkT9mQa20i-OhuC_bgwIVgEionsyIQ6tHbPJfeuATmslLArvbR6CpUUo3r_r86jCgs5hwxvJw M2bmz3u2xNmEt_NgM0Sw4nKUmCFvbJHZhTl7MRCj6OlVmDivRDCvpY65n7Swn-PrpH3Wzp4lkoYpvd6j lm0Mov_1voulKdCMdzWUljeGB-eY3I02XlzI7z1mbHhkAK_oly_tZdb7nIvhy8mbEvWcSxy2_yoWeLPD xI7kh0Zzh_3hLBgnHGNc3Dyq_N9QQTHFbjuN-N9giG3HnVEu7D3phaM4UVv5cCdFFLxGs8BW6u5FBCmI inLCZ8tXOx00CQNyB7r0rJM9vjwJt-sA', 'limit' => '10', 'period' => '1', 'src' => '/2/5/b/25b8906fd4bf15bfe59bb4a8d5308715.gif', 'headerText' => undef, 'headerUrl' => undef, 'height' => '400', 'stubSrc' => undef, 'format' => 'popup', 'impDomain' => ' http://ruhc.about-home.info', 'trackingDomain' => ' http://owners.central-processing.info', 'showLogo' => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' ), 'closeUri' => '/?t=ppund&ctck=25m9bWYqUuf5sTaSy_4aygLoeNuxnMG7LgFi5M HjOIY0bsomIwAwwnuxYOGsUtRD7hwz8C_RAZajxqpUCB4eizrMfpuTYOmbS5rzwodpPpAY-A3sIndO1P mZGmuOD04DHTpbtrqDAUftb091O2VMXV2As05HW3HpZCisnwjCDLgBTSJWzmaUm1SetYi4BWE8on81AT JBOyLXHSp7-XJw80uZi1nI6pyod3f5OU-ZRfgspdsQ8wB6rJBGPrLIqrzMnk1dPT82nti1oBG7SgwN7_ 9NzvfHbb3H_uxa5dBPeh4M2fs3dArKnEgif0nFzTtfFq_cucuqQeN_v6XiETIqSg1XoJ11BYyHifhayn iDzsqEAnVKTVe9_y49awBxduJejg' } ]; Собственно, в чем загвоздка, как получить доступ к определенному элементу распарсенного массива json. Такая вот конструкция decode_json($dat)->{'format'}; не канает
|
|
« Последнее редактирование: 27-02-2014 16:06 от borbos »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #9 : 27-02-2014 16:21 » |
|
decode_json($dat) - возвращает массив. Так? Как достучаться до элемента массива? arr[0] arr->[0] arr=>[0]
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
borbos
Интересующийся
Offline
|
|
« Ответ #10 : 27-02-2014 21:08 » |
|
decode_json($dat) - возвращает массив. Так? Хэш, если быть точным. Как достучаться до элемента массива? arr[0] arr->[0] arr=>[0]
Не работает, пробовал.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #11 : 27-02-2014 21:51 » |
|
Хэш, если быть точным. Та ты что? И что? Не работает, пробовал. Что пробовал? Я тебе показал три? варианта А посмотреть в документацию?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
borbos
Интересующийся
Offline
|
|
« Ответ #12 : 28-02-2014 16:26 » |
|
Та ты что? И что? А ничего.... Что пробовал? Все - гугл, англоязычные ветки форумом, напрягать свои извилины. Я тебе показал три? варианта ОНи не работают - возвращается хеш массива, а не сами значения или не возвращается ничего... А посмотреть в документацию?
Смотрел, там об этом сказано туманно и вскользь, непонятно вообще ничего...
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #13 : 28-02-2014 18:41 » |
|
$VAR1 = [ { 'width' => '240',
my $data = decode_json($dat); print $data->[0]{width};
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #14 : 28-02-2014 18:53 » |
|
RXL, ну зачем же обухом по голове?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
borbos
Интересующийся
Offline
|
|
« Ответ #15 : 28-02-2014 19:38 » |
|
Хм, действительно все просто. Спасибо большое, все работает.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #16 : 28-02-2014 21:20 » |
|
Слав, тут учить нечему — он даже основы основ не знает.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #17 : 01-03-2014 06:16 » |
|
RXL, ну дело не в знании основ, а в намерениях. Бывает намерение вникнуть и разобраться, бывает: "дайте мне правильный образец и ни...ёт". Как-то это на школьное образование завязано, на привычки и сформировавшееся представление о правильном - я ещё не до конца понял, как. Но факт.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #18 : 01-03-2014 10:04 » |
|
Я считаю, что нужно понимать, что делаешь, а не писать код копипастой на авось.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
borbos
Интересующийся
Offline
|
|
« Ответ #19 : 01-03-2014 10:48 » |
|
Слав, тут учить нечему — он даже основы основ не знает.
А вот лить по напраслину не надо, Ром. Основы основ. Я виноват что ли, что описание работы с массивами в данном модуле описано через ж... ? Ну вот, парсинг обычной json структуры разжеван полностью - тут и проблем нет никаких. А про массивы описано вскользь. И не у одного меня ( по вашему такого дурака) возникли данные проблемы, Гугл соврать не даст... Обосрать человека много ума не надо, все мы - разные. А попытаться понятно объяснить, вот за это, я считаю, стоит уважать...
|
|
« Последнее редактирование: 01-03-2014 10:50 от borbos »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #20 : 01-03-2014 11:30 » |
|
Я виноват что ли, что описание работы с массивами в данном модуле описано через ж... ? Причём тут модуль? Работа с массивами - это основы языка Perl, они не зависят от модулей. Структура ясная: массив, внутри хэш. В чём проблема? В незнании синтаксиса, как с такой структурой работать.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #21 : 01-03-2014 11:34 » |
|
Эээ... А при чем тут документация модуля? Это ж основы языка. Если в каждом из нескольких десятков тысяч модулей на CPAN приложить подробную документацию по языку, это будет невозможно читать. borbos, ты наверно неверно понимаешь, с чем имеешь дело. Модуль - не утилита, не самостоятельный продукт, а программный пакет, приложение к языку. В инструкции по замене предохранителей в автомобиле нет инструкции по вождению.
|
|
« Последнее редактирование: 01-03-2014 11:37 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|