логин: 
<< предыдущая заметкаследующая заметка >>
10 мая 2014
PHP: json_decode - слушайте, ну это вообще йобаный стыд!

Ситуация: разбираюсь с API Вконтактика - на моем тестовом домашнем сервере работает, на канадском сайте - нет. Почему? Вконтактик возвращает посылку в формате json:

{"response":[{"pid":328328322,"id":"photo83220314_328328322","aid":194496433,"owner_id":83220314,"src":"http:\/\/cs608929.vk.me\/v608929314\/9b2c\/_gMwKCSPHvQ.jpg","src_big":"http:\/\/cs608929.vk.me\/v608929314\/9b2d\/VRi0-64LxHg.jpg","src_small":"http:\/\/cs608929.vk.me\/v608929314\/9b2b\/s-iiUj9HIMA.jpg","width":3,"height":14,"text":"95% (864)<br><br>Нет, нашу Победу не отдадим никому!","created":1399682380}]}

Если вдруг у кого-то на хостинге нет поддержки JSON, я в коде PHP пишу заплатку:

if(!function_exists('json_decode')) { function json_decode( $string, $assoc_array = false ) {
эмулирующая библиотека
} }

Теперь следите за руками. На домашнем сервере JSON нет. Поэтому он эмулируется заплаткой и всё прекрасно работает. А вот в Канаде JSON есть. Поэтому заплатка не задействована. И этот самый встроенный json_decode на этой самой посылке спотыкается и возвращает пустой массив.

PHP Version 5.3.10-1ubuntu3.11
json support enabled
json version 1.2.1

Я хуею, дорогая редакция!

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок
Оставить комментарий
Linux Ubuntu Firefox
 Ижевск
6
7
igel (#4266779)
в петоне все загружается нормально.
бейте лопатой авторов библиотеки за багу.
Linux Firefox
 Москва
1
0
Leonid Kaganov
Авторов какой, простите, библиотеки? Встроенной библиотеки php? Потому что библиотека-заплатка работает прекрасно.
Linux Ubuntu Firefox
 Москва
0
0
igel (#4266779)
да, авторов стандартной библиотеки.
лопатой, конечно, не обязательно, но багрепорт для приличия отправить стоит.

UPD. прочитал комментарии ниже. мда, как все печально неудобно с обработкой ошибок, однако.
Windows Firefox
 Москва
0
1
Ну, с виду JSON валидный. Смущает разве что вот это:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
в заголовке этой страницы. Строка перед json_decode никак не преобразуется (из UTF-8 в CP1251, например)? JSON должен быть в UTF-8.
А так вообще, можно поэкспериментировать, вырезая из этого JSON-а куски, пока не станет ясно, на чём именно спотыкается json_decode.
Linux Firefox
 Москва
0
0
Leonid Kaganov
Какое отношение имеет заголовок страницы html в браузере посетителя к процедуре json, которая выполняется на сервере?
Windows Firefox
 Новосибирск
0
0
Oreolek
Прямого не имеет, но если сервер тоже выдаёт JSON как text/html, а не application/json, то могут быть проблемы.
Windows Safari Chrome
 Москва
1
0
Отношение, разумеется, косвенное. Раз страница отдаётся в CP1251, то и на сервере строки в каких-то участках кода обрабатываются в этой кодировке. Вот у меня и возникло подозрение: а вдруг строка с JSON-ом конвертируется в CP1251, а дальше вызывается json_decode.
В общем, я бы посмотрел, в какой кодировке возвращает vk строку (сделать bin2hex и записать в лог, например) и в какой кодировке она подаётся на вход json_encode. Можно, конечно, просто забить на это дело и всегда использовать "заплатку".
Ну и в порядке "общего бреда": не добавляется ли в HTTP-запрос на vk что-то типа заголовка "Accept-Charset" с не-utf8?
Linux Firefox
 Санкт-Петербург
1
0
SunChaser
PHP 5.6 всё расшифровывет. А что показывает функция json_last_error(), запущенная сразу после такого?
Linux Firefox
 Москва
0
0
Leonid Kaganov
Спасибо попробовал - показывает "5".
Linux Firefox
 Санкт-Петербург
1
0
SunChaser
как ни странно, товарищ коментом выше прав
5 это JSON_ERROR_UTF8 (Malformed UTF-8 characters, possibly incorrectly encoded) — json обязан быть в валидном UTF-8, сp1251 не катит
Windows Safari Chrome
 Москва
0
0
По поводу PHP 5.6 - как вы это определили? Если просто скопипастили из браузера - то это мало о чём скажет. Текст в буфер копируется или вместе с информацией о кодировке или сразу в юникоде (что в виндах, что в X11 - специально полуркал).
А если посмотреть исходник страницы, то по нему тоже трудно что-то понять о том, что же было скормлено json_decode-у (там всё поэскейплено).
P.S. Но это всё уже тонкости (и даже занудство) :)
Linux Ubuntu Firefox
 Белоруссия
0
0
meequz
Где-то у вас ошибка. Под каждой фоткой в контакте подпись к следующей, а не к ней.
Linux Firefox
 Москва
0
0
Leonid Kaganov
Это сделано специально, чтобы при сборе пост выглядел цельным постом с текстом и фотками. Отдельно просматривать фотографии в отрыве от поста - нет, на это не затачивалось.
Linux Ubuntu Firefox
 Белоруссия
0
0
meequz
А смысл не затачивать на это, если все смотрят фотки поста из своей ленты, листая их? Редко кто открывает пост отдельной страницей.
Linux Firefox
 Москва
0
0
Leonid Kaganov
Я не очень значит понимаю устройство вконтакта.

Давайте попробуем разобраться.

1. Задача: максимально корректно отобразить пост из блога так, чтобы его могли легко и удобно читать пользователи Вконтакта.

2. У меня есть в блоге некий пост, который состоит из текста, перемежающегося фотками. Сразу оговорим, что пост писался для моего блога, и никакого другого поста у меня нет и вручную подготовлено не будет - речь об организации автоматической трансляции имеющегося без приложения ручных усилий.

3. Я никогда не создаю фотоальбомы ради выкладывания верениц всяких пляжных, путевых и прочих фоток. Сами по себе фотографии у меня не являются целью публикации в отрыве от текста и контекста. Мне нет смысла делать усилия по публикации фотографий (для примера представим, что это фотка рукоятки электроплиты), если читатель увидит это в фотоальбоме и не будет обладать остальной информацией из поста о том, что это, с какой целью и для иллюстрации чего выложено.

4. Вконтакт позволяет залить фотки (с короткими подписями) и публиковать текст поста на стену. В этом случае пост выглядит как текст со вставленными в разных местах фотками. Если фотки публиковать без подписей - они просто сгрудятся кучей внизу поста, и будет неясно, о чем речь.

5. Я не нашел возможности публиковать пост с вставкой фоток в нужных местах. Есть возможность делать некую "заметку", но она, насколько я понял, не отображается в лентах для удобного просмотра без дополнительного клика. А если заставлять людей кликать, чтобы "прочитать больше" - то нахуя тогда заметка, пусть тогда прямо на мой сайт попадают.

Как-то так формулируется задача.

Что бы вы предложили?

PS: Я, конечно, могу как в Твиттере и Фейсбуке - постить голый текст или его кусок с предложением "читать дальше на моем сайте". Тогда и фотки не нужны. Но нет ли идеи умнее?
Linux Firefox
 Белоруссия
0
0
meequz
В ВК пост имеет две части. Первая - текст. Вторая - вложения, до десяти штук. Обычно это фотки. Под каждой фоткой можно написать небольшой комментарий. Упрощая, можно сказать, что пользователь вк приучен прочесть текст, посмотреть фотки под ним и перейти к следующему посту.

Сделать полноценную запись с кучей текста, потом фотками, потом снова текстом, как в жж или у вас в блоге, в контакте нельзя. Если очень хочется, есть заметки и вики-страницы. Но они да, без дополнительного клика не откроются.

Выход я вижу такой: постить сначала весь текст, а потом фотки с подписями. Ведь и в вашем дневнике подпись отображается под фоткой, если кликнуть на неё.

Можно, кстати, больше десяти фоток, но тогда надо создать так называемый альбом и вставить его ссылку в пост. Контакт её подхватит и отобразит как приложенный альбом. Фотки из него будут листаться так же удобно.

Откройте в ленте vk.com/feed любой пост с фотками и пощёлкайте по ним, должно стать ясно.

Если ещё какие вопросы по вконтакту, с удовольствием отвечу.
Linux Firefox
 Москва
0
0
Leonid Kaganov
а могу я создавать по новому альбому на каждый пост?
Linux Firefox
 Москва
0
0
Leonid Kaganov
в смысле - в посте ограничение 10 фотографий, а какое ограничение по альбомам - сколько их себе может создать пользователь?
Linux Ubuntu Firefox
 Белоруссия
0
0
meequz
Наверное бесконечность, не слышал чтобы были ограничения на это. Извинясь за задержку с ответом, уведомление о коменте gmail положил в спам.

всего комментариев: 19

<< предыдущая заметка следующая заметка >>