Problema al leer archivo JSON desde PHP

Un problema muy común a la hora de trabajar con archivos JSON en PHP es que a veces, suelen surgir problemas a la hora de leer el archivo.

Inicialmente, abrimos un archivo JSON con la función file_get_contents(), y guardamos el contenido (que es un String) en una variable. Después para transformar el String en un objeto JSON, para que podamos recorrerlo y trabajar con él, pasamos una función llamada json_decode(), que nos devuelve un array de la estructura del JSON. Y ya con ese array podemos trabajar mejor, para buscar un valor por una clave, o para recorrer el JSON imprimiendo el contenido de forma ordenada.

Esto sería el código de ejemplo del PHP readJSON.php, que se encargaría de leer el archivo JSON e imprimirlo por pantalla:

$jsonfile = file_get_contents(ejemplo.json);
$arrayjson = json_decode($jsonfile, true);
print_r($arrayjson);

Sobre el código anterior, en la variable $jsonfile se guarda correctamente el string del JSON que se recoge del archivo con la función file_get_contents(). Si lo imprimes por pantalla aparece bien. Pero al pasar la función json_decode(), devuelve un array vacío (NULL), pero no da ningún error al ejecutarlo en el navegador que esté relacionado con esto.  El problema, es que el archivo ejemplo.json no está codificado a UTF-8 y por tanto, la función json_decode() no puede transformar el String $jsonfile a una estructura JSON legible.

Una posible solución es coger el archivo ejemplo.json, abrirlo con un editor como Sublime Text o Notepad++ y en las opciones de codificado, cambiar su codificación a UTF-8 y guardar.

Pero una solución más rápida y que nos asegura que siempre que se transforme el JSON el string va a estar codificado a UTF-8, es la siguiente: después de leer el archivo ejemplo.json, codificarlo a UTF-8 por código y finalmente pasárselo al json_decode() ya codificado a UTF-8.

Quedaría de la siguiente forma:

$jsonfile = file_get_contents(ejemplo.json);
$jsonencode = utf8_encode($jsonfile);
$arrayjson = json_decode($jsonencode, true);
print_r($arrayjson);

Si el problema es que ni siquiera funciona el leer el archivo ejemplo.json con la función file_get_contents, mirar aquí.