Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: JSON и ошибки парсинга  (Прочитано 23838 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
borbos
Интересующийся

ru
Offline Offline

« : 25-02-2014 23:12 » new

Приветствую. Есть на cpan модуль для парсинга json-а - JSON, до поры до времени все было нормально. Но, вот, немного изменился формат присылаемых данных - в json стал встречаться русский тест, теперь парсер спотыкается. Что делать???
Код: (Javascript)
{"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
Специалист

ru
Offline Offline

« Ответ #1 : 26-02-2014 04:05 » 

Перед парсингом конвертировать текст в ANSI. Он скорее всего в UTF8 на входе...
Записан

while (8==8)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 26-02-2014 08:42 » 

Это неправильный json формат

По крайней мере utf-8 должно быть кодированым.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
borbos
Интересующийся

ru
Offline Offline

« Ответ #3 : 26-02-2014 15:28 » 

Странно, я думал, что для JSON utf8 это родной формат. А данные и правда приходят в utf8, причем, если нет русских символов, то все отлично, в противном случае, парсер спотыкается на русских словах и дальше не идет.  С ума сойти...
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 26-02-2014 15:36 » 

Да, родной
вот браузер получает
Цитата
\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435
А то что у тебя - увы - подобие - соблюден только формат данных
« Последнее редактирование: 26-02-2014 15:40 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #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
Интересующийся

ru
Offline Offline

« Ответ #6 : 27-02-2014 00:47 » 

Да разобрался вроде как уже, спасибо.  Улыбаюсь
Кстати, как вытащить значение из массива json, что то не получается, возвращает хэш какой то. Хотя дата дампером вытаскивается нормально.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 27-02-2014 06:07 » 

Кстати, как вытащить значение из массива json
Какого?

, что то не получается, возвращает хэш какой то
Какой?

. Хотя дата дампером вытаскивается нормально.
Каким? Как?

Извини, хрустальный шар куда-то закатился...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
borbos
Интересующийся

ru
Offline Offline

« Ответ #8 : 27-02-2014 16:03 » 

Сорри, туплю.
Парсим массив в формате json
Код: (Perl)
#/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

Код: (Perl)
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. Такая вот конструкция
Код: (Perl)
decode_json($dat)->{'format'};
не канает
« Последнее редактирование: 27-02-2014 16:06 от borbos » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 27-02-2014 16:21 » 

decode_json($dat) - возвращает массив.
Так?

Код:
Как  достучаться до элемента массива?
arr[0]
arr->[0]
arr=>[0]
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
borbos
Интересующийся

ru
Offline Offline

« Ответ #10 : 27-02-2014 21:08 » 

decode_json($dat) - возвращает массив.
Так?

Хэш, если быть точным.

Код:
Как  достучаться до элемента массива?
arr[0]
arr->[0]
arr=>[0]

Не работает, пробовал.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 27-02-2014 21:51 » 

Цитата
Хэш, если быть точным.
Та ты что? И что?

Цитата
Не работает, пробовал.
Что пробовал?

Я тебе показал три? варианта

А посмотреть в документацию?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
borbos
Интересующийся

ru
Offline Offline

« Ответ #12 : 28-02-2014 16:26 » 

Та ты что? И что?
А ничего....

Что пробовал?
Все - гугл, англоязычные ветки форумом, напрягать свои извилины.


Я тебе показал три? варианта
ОНи не работают - возвращается хеш массива, а не сами значения или не возвращается ничего...

А посмотреть в документацию?
Смотрел, там об этом сказано туманно и вскользь, непонятно вообще ничего...
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 28-02-2014 18:41 » 

Цитата
$VAR1 = [
          {
            'width' => '240',

Код: (Perl)
my $data = decode_json($dat);
print $data->[0]{width};
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 28-02-2014 18:53 » 

RXL, ну зачем же обухом по голове?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
borbos
Интересующийся

ru
Offline Offline

« Ответ #15 : 28-02-2014 19:38 » 

Хм, действительно все просто. Спасибо большое, все работает.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 28-02-2014 21:20 » 

Слав, тут учить нечему — он даже основы основ не знает.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 01-03-2014 06:16 » 

RXL, ну дело не в знании основ, а в намерениях. Бывает намерение вникнуть и разобраться, бывает: "дайте мне правильный образец и ни...ёт". Как-то это на школьное образование завязано, на привычки и сформировавшееся представление о правильном - я ещё не до конца понял, как. Но факт.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 01-03-2014 10:04 » 

Я считаю, что нужно понимать, что делаешь, а не писать код копипастой на авось.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
borbos
Интересующийся

ru
Offline Offline

« Ответ #19 : 01-03-2014 10:48 » 

Слав, тут учить нечему — он даже основы основ не знает.
А вот лить по напраслину не надо, Ром. Основы основ. Я виноват что ли, что описание работы с массивами в данном модуле описано через ж... ? Ну вот, парсинг обычной json структуры разжеван полностью - тут и проблем нет никаких. А про массивы описано вскользь. И не у одного меня ( по вашему такого дурака) возникли данные проблемы, Гугл соврать не даст...
Обосрать человека много ума не надо, все мы - разные. А попытаться понятно объяснить, вот за это, я считаю, стоит уважать...
« Последнее редактирование: 01-03-2014 10:50 от borbos » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 01-03-2014 11:30 » 

Цитата: borbos
Я виноват что ли, что описание работы с массивами в данном модуле описано через ж... ?
Причём тут модуль? Работа с массивами - это основы языка Perl, они не зависят от модулей. Структура ясная: массив, внутри хэш. В чём проблема? В незнании синтаксиса, как с такой структурой работать.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 01-03-2014 11:34 » 

Эээ... А при чем тут документация модуля? С ума сойти...
Это ж основы языка. Если в каждом из нескольких десятков тысяч модулей на CPAN приложить подробную документацию по языку, это будет невозможно читать.

borbos, ты наверно неверно понимаешь, с чем имеешь дело. Модуль - не утилита, не самостоятельный продукт, а программный пакет, приложение к языку. В инструкции по замене предохранителей в автомобиле нет инструкции по вождению.
« Последнее редактирование: 01-03-2014 11:37 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines