#php #json #google-chrome
#php #json #google-chrome
Вопрос:
Все ключи были заключены в двойные кавычки. Весь элемент был объектом. Firefox работает хорошо, но Chrome сообщает «недопустимый JSON». Почему?
Это полный код.
///////////// PHP ////////////////
public function listAlbumAction()
{
$params = $this->_getAllParams();
$albums = $this->_album->getAlbumList($params['albumType'], $params['from'], $params['numberOfAlbums']);
echo json_encode(array("code" => 0, "data" => $albums));
}
///////////////////////////////// JQuery ///////////////////
function loadAlbums()
{
$.ajax({
type: 'GET',
url: '/about-photo/list-album',
data: {albumType: selectedAlbumType, from: currentPageIndex * numOfAlbumsPerPage, numberOfAlbums: numOfAlbumsPerPage},
success: function(json) {
var obj;
var data;
try {
obj = $.parseJSON(json);
data = obj.data;
} catch(e) {
alert(e);
}
if(obj.code == 0) {
// get number of albums
var num = data.length;
// remove old list content
$('#albumListContent').remove();
var albumListHTML = '';
albumListHTML = '<div id="albumListContent">';
for(var i = 0; i < num; i) {
albumListHTML = '<div id="w' data[i].album_id '" class="imgWrapper">';
albumListHTML = '<img id="a' data[i].album_id
'" class="albumImg" width="150px" src="'
data[i].album_cover '" alt="not found" title="'
data[i].album_name '"/>';
albumListHTML = '<div class="albumTitle">' data[i].album_name '</div>';
albumListHTML = '</div>';
}
albumListHTML = '</div>';
$('#albumListContentWrapper').html(albumListHTML);
addAlbumHandler();
addPhotoEffects('.albumImg');
addImgErrorHandler('.albumImg');
}
}
});
}
Редактировать: вывод JSON из Chrome (FirebugLite):
{"code":0,"data":[{"album_id":42,"album_name":"Best album","album_type":"photo","create_date":"09-05-2011 5:48:40","album_cover":"/x/media/6.jpg","description":"Something here"},{"album_id":56,"album_name":"Test album","album_type":"photo","create_date":"09-05-2011 19:27:50","album_cover":"/x/media/44227440_2f1f369517.jpg","description":"apples"},{"album_id":59,"album_name":"Album for something","album_type":"photo","create_date":"10-05-2011 16:19:03","album_cover":"/x/media/apple-howto.jpg","description":"zzz"},{"album_id":62,"album_name":"Vietnam - Thailand - AFF Suzuki cup 2007","album_type":"photo","create_date":"17-05-2011 14:30:32","album_cover":"/x/media/pwjps1231986828.jpg","description":""},{"album_id":63,"album_name":"CS","album_type":"photo","create_date":"17-05-2011 15:24:01","album_cover":"/x/media/apple-logo.jpg","description":""},{"album_id":64,"album_name":"It works","album_type":"photo","create_date":"17-05-2011 15:24:56","album_cover":"/x/media/it_works.png","description":""}]}
Вывод JSON из Firefox (Firebug):
{"code":0,"data":[{"album_id":42,"album_name":"Best album","album_type":"photo","create_date":"09-05-2011 5:48:40","album_cover":"/x/media/6.jpg","description":"Something here"},{"album_id":56,"album_name":"Test album","album_type":"photo","create_date":"09-05-2011 19:27:50","album_cover":"/x/media/44227440_2f1f369517.jpg","description":"apples"},{"album_id":59,"album_name":"Album for something","album_type":"photo","create_date":"10-05-2011 16:19:03","album_cover":"/x/media/apple-howto.jpg","description":"zzz"},{"album_id":62,"album_name":"Vietnam - Thailand - AFF Suzuki cup 2007","album_type":"photo","create_date":"17-05-2011 14:30:32","album_cover":"/x/media/pwjps1231986828.jpg","description":""},{"album_id":63,"album_name":"CS","album_type":"photo","create_date":"17-05-2011 15:24:01","album_cover":"/x/media/apple-logo.jpg","description":""},{"album_id":64,"album_name":"It works","album_type":"photo","create_date":"17-05-2011 15:24:56","album_cover":"/x/media/it_works.png","description":""}]}
Я проверил это с помощью http://jsonlint.com / и там написано «Допустимый JSON»
Редактировать:
Источник просматривается в Chrome:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Комментарии:
1. Как выглядит ваш фактический вывод JSON?
2. @Jahufar — а?
json_encode()
не отправляет никаких заголовков; он только выдает строку.3. Этот jsFiddle работает или не работает для вас? (Работает для меня в Chrome.)
4. Есть ли у вас спецификация Unicode (знак порядка байтов) в начале вашего PHP-файла? Если да, можете ли вы узнать, может ли ваш редактор сохранить файл без него и повторить попытку?
5. @Matt Gibson: Я использую Notepad для написания веб-страниц, я изменил их все в Utf8 без спецификации, и он успешно запускается! Пожалуйста, опубликуйте это как ответ и объясните мне, ПОЧЕМУ. : D
Ответ №1:
У вас есть знак порядка байтов в Юникоде в начале вашего PHP-файла. Из-за этого, а также потому, что это перед открытием <?php
, оно отправляется клиенту в начале вашего JSON. Это сделает ваш JSON недействительным, поскольку эти символы не должны появляться в начале данных JSON. Некоторые браузеры прекрасно с этим справляются; другие браузеры, такие как Chrome, более суетливы и жалуются.
Удаление метки порядка байтов путем сохранения файла без этого параметра, установленного в вашем редакторе (как это сделать, зависит от редактора), решит вашу проблему.
(Вы, вероятно, также обнаружите, что header()
и другие функции PHP, отправляющие заголовки, также не будут работать в вашем PHP-файле, выдавая ошибку, что вывод уже запущен, опять же, потому что спецификация была бы отправлена до того, как ваш PHP начал интерпретироваться.)
Комментарии:
1. Спасибо. Кстати, Chrome такой строгий. xD
2. У меня была аналогичная проблема с IE6 и Safari4. Ваш ответ помог мне решить эту проблему. Спасибо!
Ответ №2:
Мое предположение (основанное на разнице между предоставленными вами выводами Chrome и Firefox) заключается в том, что у вас есть некоторые начальные (или конечные) пробелы и / или разрывы строк, проникающие в ваш вывод PHP.
Вы предоставили PHP только для соответствующих функций, но убедитесь, что у вас нет пробелов до или после тегов <?php
и ?>
, как в вашей основной программе, так и в любых других файлах PHP, загруженных с помощью include()
or require()
.
Это довольно распространенная проблема с PHP-кодом. На обычной HTML-странице это на самом деле не имеет значения (в итоге вы получаете множество ложных пробелов, но это не влияет на рендеринг), но при выводе других типов данных это может повлиять на то, являются они допустимыми или нет. Это особенно верно, если вы выводите двоичные данные. Я раньше не сталкивался с этой проблемой с JSON, но пробелы в начале строки, которую вы процитировали, являются классическим признаком такого рода вещей.
Комментарии:
1. Я загружаю весь исходный код, но не могу найти никаких лишних пробелов. Спасибо за вашу помощь.
Ответ №3:
попробуйте заключить JSON (в PHP-коде) в квадратные скобки … и удалите их в функции успешного выполнения вызова ajax перед parseJOSN
.