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

标签 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" /> 

最佳答案

你有一个 Unicode Byte Order Mark在 PHP 文件的开头。因为这个,也因为它在开幕之前 <?php ,它会在您的 JSON 开头发送给客户端。这将使您的 JSON 无效,因为这些字符不应出现在 JSON 数据的开头。一些浏览器可以很好地应对;其他浏览器(例如 Chrome)则比较挑剔和提示。

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

(您可能还会发现 header() 和其他发送 header 的 PHP 函数在您的 PHP 文件中也不起作用,给您输出已经开始的错误,再次因为 BOM 已经发送在你的 PHP 开始被解释之前。)

关于php - 在 Chrome 中无效的 JSON,在 Firefox 中没有问题(太奇怪了!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6066901/

相关文章:

javascript - 如何在 Javascript 中捕获 404 错误?

css - Chrome 神秘地将 SVG 位置降低了 2px

php - 如何在连接表中设置 Laravel 的 Eloquent 关系?

PHP-Mysql WHERE 为空并返回结果

php - 在表数组上应用 where 条件

json - 你能推荐我一个 json 查看器应用程序吗?

java - 线程中的异常 "main"org.json.JSONException : A JSONObject text must begin with '{' at 1 [character 2 line 1]

php - Codeigniter:无法使用提供的设置连接到您的数据库服务器

php - 为 php mysql 查询创建缓存

ajax - Chrome 扩展中的 AJAX 请求失败,但 list 权限正确?