JSON no válido en Chrome, no hay problema en Firefox (¡qué extraño!)

Todas las llaves fueron citadas. El elemento completo era un objeto. Firefox lo ejecuta bien pero Chrome informa “JSON no válido”. ¿Por qué?

Este es el código completo.

///////////// 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 += '
'; for(var i = 0; i < num; ++i) { albumListHTML += '
'; albumListHTML += 'not found'; albumListHTML += '
' + data[i].album_name + '
'; albumListHTML += '
'; } albumListHTML += '
'; $('#albumListContentWrapper').html(albumListHTML); addAlbumHandler(); addPhotoEffects('.albumImg'); addImgErrorHandler('.albumImg'); } } }); }

Editar : Salida JSON desde 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":""}]} 

Salida JSON desde 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":""}]} 

Lo comprobé con http://jsonlint.com/ y dice “JSON válido”

Editar :

Fuente vista desde Chrome:

     

Solutions Collecting From Web of "JSON no válido en Chrome, no hay problema en Firefox (¡qué extraño!)"

Tiene una marca de orden de byte Unicode al comienzo de su archivo PHP. Debido a esto, y debido a que es antes de la apertura < ?php , se envía al cliente al comienzo de su JSON. Esto hará que su JSON no sea válido, ya que esos caracteres no deberían aparecer al comienzo de los datos JSON. Algunos navegadores lo soportan bien; otros navegadores, como Chrome, son más exigentes y se quejan.

Eliminar la marca de orden de bytes guardando el archivo sin esa opción establecida en su editor (cómo hacerlo depende del editor) resolverá su problema.

(Probablemente también encuentre que el header() y otras funciones de PHP que envían encabezados tampoco funcionarían en su archivo PHP, lo que le da el error de que la salida ya comenzó, porque la BOM se habría enviado antes de su PHP comenzó a ser interpretado.)

Mi suposición (basada en la diferencia entre los resultados de Chrome y Firefox que usted proporcionó) sería que tiene algunos espacios iniciales (o finales) y / o saltos de línea que se cuelan furtivamente en su salida de PHP.

Solo ha proporcionado PHP para las funciones relevantes, pero verifique que no haya ningún espacio en blanco antes o después de las tags < ?php and ?> , Tanto en su progtwig principal como en cualquier otro archivo PHP cargado con include() o require() .

Es un problema bastante común con el código PHP. En una página HTML normal, en realidad no importa (usted termina con una carga de espacio en blanco falso, pero no afecta el renderizado), pero al generar otros tipos de datos puede marcar la diferencia entre que sea válido o no. Esto es especialmente cierto si está generando datos binarios. No he visto este problema antes con JSON, pero los espacios en blanco al comienzo de la cadena que citó son una señal clásica de este tipo de cosas.

intente Encapsular el JSON (en código PHP) entre paréntesis … y eliminarlos en la función de éxito de la llamada ajax antes de parseJOSN .