Chrome中的JSON无效,Firefox中没问题(太奇怪了!)

时间:2011-05-20 02:34:16

标签: 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');
            }
        }
    });
}

修改:Chrome(FirebugLite)的JSON输出:

    {"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":""}]}

Firefox(Firebug)的JSON输出:

{"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 个答案:

答案 0 :(得分:11)

PHP文件的开头有一个Unicode Byte Order Mark。因此,并且因为它在开始<?php之前,它会在您的JSON开头发送到客户端。这将使您的JSON无效,因为这些字符不应出现在JSON数据的开头。有些浏览器可以很好地应对它;其他浏览器,如Chrome,更加麻烦和抱怨。

通过保存文件而不在编辑器中设置该选项来删除字节顺序标记(如何执行此操作取决于编辑器)将解决您的问题。

(您可能还会发现header()和其他发送标头的PHP函数也无法在您的PHP文件中运行,从而导致输出已经启动的错误,因为BOM会有在PHP开始被解释之前发送过。)

答案 1 :(得分:2)

我的猜测(基于您提供的Chrome和Firefox输出之间的差异)将是您有一些前导(或尾随)空格和/或换行符潜入您的PHP输出。

您只提供了相关功能的PHP,但检查您的主程序中的<?php?>标记之前或之后是否有空格。其他PHP文件加载include()require()

这是PHP代码的一个相当普遍的问题。在普通的HTML页面中,它并不重要(最终会产生大量的虚假空白,但它不会影响渲染),但是在输出其他类型的数据时,它可以区分它有效或者不。如果您输出二进制数据,则尤其如此。我之前没有看过这个问题,但是你引用的字符串开头的空格是这类事情的经典标志。

答案 2 :(得分:0)

尝试在括号中封装JSON(在PHP代码中)...并在ajax调用befor parseJOSN的成功函数中删除它们。