Archivo

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í.

 

Índices de un array mal generados al codificar con json_encode en PHP

Algunas veces, cuando queremos transformar un array a una estructura JSON usando la función json_encode de PHP, sucede que se genera mal la estructura del JSON. A los primeros elementos del JSON, le pone de clave los índices del array en String. Esas claves no se añaden por código, si no que lo hace sólo el json_encode.

Este problema ocurre porque los índices del array que se va a codificar a JSON, no son correlativos o no empiezan por cero.

Cuando se codifica un array, si las claves no están en una secuencia numérica continua comenzando por 0, todas las claves son codificadas como cadenas, y especificadas para cada pareja clave-valor.

La solución es poner los índices del array a convertir a JSON, de forma numérica y secuencial.

Error 404 al leer archivo JSON desde navegador o js

Os ha ocurrido alguna vez que al leer un archivo JSON desde un navegador o desde un Javascript, aparece el error 404 como que ese archivo no se encuentra en el servidor, pero en realidad si que está alojado en el servidor.

Pues este error ocurre mucho en los servidores Windows, porque el servidor de Windows no tiene habilitada la extensión JSON en la configuración MIME Types y por lo cuál, no puede abrir un archivo con extensión .json. Tan sólo hay que habilitarla y ya funcionaría.

Para habilitar la extensión JSON en la configuración MIME Types de un servidor Windows, hay que realizar lo siguiente:

1. Abrir IIS Manager, y con el botón derecho abrir las propiedades del IIS Server.
2. Añadir la extensión ‘json’ MIME Type:

2.1. Hacemos doble click sobre el icono “MIME Types”.
2.2. Después pulsar  en “Add MIME Type” (debajo de la sección Acciones del lado derecho)
2.3. En la ventana “Add MIME Type” añadir:

File name extension: .json
MIME type: application/x-javascript

2.4. Pulsar en OK, y deberías ver el MIME Type .json añadido en la lista de MIME Types.

3.  Añadir el Script Map Handelr para el MIME Type “json”:

3.1. Hacemos doble click en el icono de “Handler Mappings”
3.2. Pulsar en “Add Script Map…”  (debajo de la sección Acciones del lado derecho)
3.3. En la ventana “Add Script Map” añadir:

Request path: *.json
Executable: C:\Windows\System32\inetsrv\asp.dll
Name: JSON

3.4. Pulsar en OK ( Aparecerá una ventana de alerta con el mensaje: Do you want to allow this ISAPI extension?…etc ) Pulsa en Yes. Deberías ver la extensión .json añadida a la lista de Handler Mappings.

Otra posible solución, un poco más “apaño”, es que cómo desde un Javascript o desde el mismo navegador no se puede acceder al JSON, pero desde PHP si (lo podemos comprobar ejecutando la función phpinfo() para saber si PHP lo tiene habilitado), lo que se puede hacer es crear un PHP que sea el que lea el JSON y lo devuelva como cadena de texto. Después desde el Javascript donde no podemos leer directamente el JSON, lo que hacemos es llamar al PHP que hemos creado, y metemos el resultado en una variable. Ahora sí que podemos leer el JSON desde Javascript.

Opción 1. Esto sería un ejemplo del código que se usa para leer el JSON desde Javascript directamente (necesitaremos habilitar la extension en el servidor):

$.getJSON(‘ejemplo.json’, function(contentFile){
//lo que queramos hacer con el JSON
});

Opción 2. Si no conseguimos habilitar la extensión JSON en el servidor y por lo cuál al ejecutar el código de la opción1 nos da el error 404, la opción 2 es hacerlo pero a través de un PHP.

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

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

Código de ejemplo del Javascript que lee el JSON a través de un PHP:

var jsonFile = “getJSON.php”; //el php que nos devuelve el contenido del JSON en formato texto

$.getJSON( jsonFile, {
format: “json”
}).done(function( contentFile ) {
//lo que queramos hacer con el JSON
});

Esta última opción sólo la usaría en el caso crítico de que no consiga habilitar la extensión JSON en el servidor Windows, ya que es posible que no tengamos acceso a la configuración del servidor y necesitemos una solución rápida, pero no es lo más recomendado.