Неверный JSON в Chrome, нет проблем в Firefox (так странно!) - PullRequest
8 голосов
/ 20 мая 2011

Все ключи были в двойных кавычках.Весь элемент был объектом. 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" /> 

Ответы [ 3 ]

11 голосов
/ 20 мая 2011

У вас есть Unicode Порядок следования байтов в начале вашего PHP-файла. Из-за этого и из-за того, что он находится перед открытием <?php, он отправляется клиенту в начале вашего JSON. Это сделает ваш JSON недействительным, так как эти символы не должны появляться в начале данных JSON. Некоторые браузеры прекрасно справляются с этим; другие браузеры, такие как Chrome, шумнее и жалуются.

Снятие метки порядка байтов путем сохранения файла без этой опции, установленной в вашем редакторе (как это сделать, зависит от редактора), решит вашу проблему.

(Возможно, вы также обнаружите, что header() и другие функции PHP, которые отправляют заголовки, также не будут работать в вашем файле PHP, сообщая об ошибке, что вывод уже начался, опять же, потому что спецификация была бы отправлена до того, как ваш PHP начал интерпретироваться.)

2 голосов
/ 20 мая 2011

Я предполагаю (исходя из разницы между предоставленными вами выходами Chrome и Firefox), что у вас есть несколько начальных (или конечных) пробелов и / или разрывов строк, пробирающихся в ваш вывод PHP.

Вы предоставили PHP только для соответствующих функций, но убедитесь, что у вас нет пробелов до или после тегов <?php и ?>, как в основной программе, так и в любых других файлах PHP, загруженных с * 1005.* или require().

Это довольно распространенная проблема с PHP-кодом.На обычной HTML-странице это не имеет большого значения (в результате вы получаете массу ложных пробелов, но это не влияет на рендеринг), но при выводе других типов данных это может иметь значение, если они действительны илине.Это особенно верно, если вы выводите двоичные данные.Я никогда не сталкивался с этой проблемой в JSON, но пробелы в начале строки, которую вы цитировали, являются классическим признаком такого рода вещей.

0 голосов
/ 20 мая 2011

попробуйте инкапсулировать JSON (в коде PHP) в скобки ... и удалить их в функции успеха вызова ajax до parseJOSN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...