Producir JSON desde PHP

  • Por
Mostramos el modo de producir una cadena con notación JSON a partir de variables y objetos de PHP con la función json_encode().
En este artículo vamos a mostrar cómo crear un JSON desde PHP con las funciones nativas del lenguaje de programación del lado del servidor. Además veremos varias particularidades de la creación de cadenas de texto con notación JSON desde PHP, que son importantes de conocer para no caer en problemas comunes de este tipo de operaciones.

Como ya comentamos en el artículo anterior, en el que presentamos las librerías más fundamentales hacer JSON desde PHP, existen diversas formas para implementar funcionalidades de procesamiento de archivos JSON desde PHP. En concreto en este artículo vamos a ver las funciones nativas de PHP que sirven para este tema, que se encuentran disponibles desde la versión de PHP 5.2. Cabe recordar, no obstante, que estas mismas funciones nativas se pueden instalar por separado, si es que no las tenemos y que existen otras librerías que también ofrecen posibilidades similares.

Veremos entonces cómo producir cadenas con notación JSON a partir de variables simples, arrays y objetos PHP.

Crear un JSON desde PHP

Para crear una cadena para expresar un objeto u otro tipo de variable con JSON en PHP se dispone de una función llamada json_encode(), que recibe lo que deseamos convertir en notación JSON y devuelve una cadena de texto con el JSON producido.

Podemos convertir en JSON cualquier cosa que necesitemos, como una cadena, una variable numérica, un array -normal o asociativo- y objetos con todo tipo de datos dentro. Veremos varios ejemplos que ilustrarán este proceso.

$mivariable = "hola";
print_r(json_encode($mivariable));

Esto devuelve:

"hola"

Ahora convertimos un array normal:

$miArray = array(1,4,6,8,3,34.8,9,43);
print_r(json_encode($miArray));

Que devuelve:

[1,4,6,8,3,34.8,9,43]

Estos ejemplos anteriores son sin duda quizás demasiado simples, pero la cosa empieza a tener sentido cuando se convierte un array asociativo en JSON, como se puede ver a continuación.

$miArray = array("manzana"=>"verde", "uva"=>"Morada", "fresa"=>"roja");
print_r(json_encode($miArray));

{"manzana":"verde","uva":"Morada","fresa":"roja"}

Este resultado ya tiene una forma parecida a lo que estamos acostumbrados a ver en JSON. Podríamos fijarnos que la cadena que devuelve no tiene saltos de línea e identación de los elementos, con lo que la lectura se dificulta un poco por seres humanos. No obstante, podríamos utilizar esa cadena para crear una variable Javascript y por supuesto podremos acceder a cualquier valor del JSON, de una manera parecida a esta:

<script>
JSONFrutas = eval(<?php echo json_encode($miArray);?>);
alert(JSONFrutas.manzana);
</script>

Como se ha visto, para almacenar el JSON en una variable Javascript, sin almacenar la propia cadena, sino el objeto que representa, tenemos que utilizar la función Javascript eval(). Luego podemos acceder a los componentes del JSON como lo hacemos con cualquier objeto, variable, operador punto y luego el nombre de la propiedad a acceder.

Crear un objeto con PHP y convertirlo en JSON

Como decía, lo bonito es que desde PHP podemos convertir cualquier objeto que tengamos, para generar el JSON del mismo y poder enviarlo a Javascript o cualquier otro lenguaje o componente que necesitemos que lo procese. El mecanismo es exactamente igual, con la salvedad que primero tenemos que crear una clase, instanciar un objeto y luego convertirlo a JSON con json_encode().

Así crearíamos una clase e instaciaríamos ojetos con ella.

//creo una clase arbol
class NodoArbolDHTML{
   var $nombre;
   var $url;
   var $hijos;
   
   function __construct($nombre,$url){
      $this->nombre = $nombre;
      $this->url = $url;
   }
   
   function anadirHijo($nodoHijo, $nombre){   //añadir un hijo
      if (!isset($this->hijos)){
         $this->hijos = array();
      }
      $this->hijos[$nombre] = $nodoHijo;
   }
}

Como se ha visto, se ha implementado una clase NodoArbolDHTML, con la que podríamos crear una estructura de árbol. El árbol tiene distintos nodos y cada uno a su vez tiene un nombre, una URL y un conjunto que hijos, que también son nodos del árbol.

Ahora, podríamos instanciar objetos tipo nodo, para crear el árbol, de la siguiente manera.

$raiz = new NodoArbolDHTML("Raiz", "http://www.loquesea.com");
$miNodo = new NodoArbolDHTML("Mi arbolito", "http://www.oi.com");
$raiz->anadirHijo($miNodo, "loquesea");
$miNodo2 = new NodoArbolDHTML("Mi otro nodo", "http://www.as.com");
$raiz->anadirHijo($miNodo, "otro");

Con esto ya tenemos la mayor parte del trabajo creado, porque para producir el JSON simplemente tenemos que llamar a la función json_encode(), que ya hemos visto repetidas veces:

print_r(json_encode($raiz));

Con esto mostraríamos en la página la cadena:

{"nombre":"Raiz","url":"http://www.loquesea.com","hijos":{"loqesea":{"nombre":"Mi arbolito","url":"http://www.oi.com","hijos":null},"otro":{"nombre":"Mi arbolito","url":"http://www.oi.com","hijos":null}}}

Nota: Las barras de "http://" están bien escritas, aunque aparezcan como "http://", lo que pasa es que PHP se les coloca una contrabarra como caracter de escape.

De nuevo la forma como se muestra la cadena no tiene muy fácil lectura, por la falta de saltos de línea y los identados. Pero bueno, eso no es problema para Javascript, como podremos ver en el código siguiente, que ilustra la manera en que podemos utilizar ese JSON para crear objetos en el cliente.

<?php
$arbol_php = json_encode($raiz);
?>
<script>
var arbolJavascript = eval(<?php echo $arbol_php;?>);
alert(arbolJavascript.hijos.loquesea.nombre);
alert(arbolJavascript.hijos.otro.url);
</script>

Escapar caracteres especiales en cadenas JSON

En la notación JSON se utiliza Unicode como juego de caracteres, por su universalidad. Por tanto, en Unicode hay determinados caracteres, como pueden ser la eñe, letras con acentos, etc, que tienen que convertirse en sus correspondientes códigos de escape para que todo funcione correctamente. Por ejemplo, la letra "ñ" tiene el código "u00f1". En las cadenas que utilizamos en la notación JSON se deben colocar entonces caracteres Unicode, excepto las comillas dobles (que se utilizan para delimitar la cadena y por tanto se debe escapar) y la barra invertida, que es el carácter de escape.

Afortunadamente, la función PHP json_encode() hace la conversión de las cadenas a Unicode automáticamente, por lo que no nos deberíamos preocuparnos por este detalle, sin embargo, PHP toma de manera predeterminada que la cadena de origen está en UTF-8, por lo que, si trabajamos con archivos en ISO-8859-1, tendremos que convertirlos antes a UTF-8.

Por ejemplo, en mi ejemplo PHP, que tengo en mi ordenador guardado con ISO-8859-1, si intento crear un JSON de esta manera:

$miArray = array("París"=>"Francia", "Madrid"=>"España");
print_r(json_encode($miArray));

Obtengo la siguiente cadena:

{null:"Francia","Madrid":null}

Esto se soluciona, como digo, convirtiendo antes las cadenas a UTF-8, al menos las que tienen caracteres distintos del alfabeto inglés.

<?php
$miArray = array(utf8_encode("París")=>"Francia", "Madrid"=>utf8_encode("España"));
print_r(json_encode($miArray));
?>

Con lo que obtengo la siguiente cadena codificada con JSON:

{"Paru00eds":"Francia","Madrid":"Espau00f1a"}

Con este artículo de desarrolloweb .com ya hemos visto cómo podemos producir cadenas con notación JSON a partir de variables, arrays u objetos. Esperamos que haya sido instructivo y os citamos para el próximo artículo, en el que veremos cómo crear variables u objetos PHP a partir del contenido de cadenas JSON.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

carlosAugusto

04/11/2009
Corrigiendo erro de alcance
En mi caso al llevar a efecto el ejemplo de la clase, me marcaba errores los cuales fueron corregidos al anteponerles a las propiedades "public". Posteriormente intente ejecutar el mismo ejemplo pero ahora con private y simplemente lo que obtengo es un dato indefinido

rloopez

02/12/2010
Un pedazo artículo de json en PHP
Este artículo me ha aclarado muchas dudas sobre JSON en PHP... les felicito!

David

30/5/2011
Codificación json
Hola! Son geniales!!!
Estaba buscando hace 5 horas la solución al problema de las tildes y sólo en esta página la encontre:

"...utf8_encode("París")=>"Francia", "Madrid"=>utf8_encode("España"));..."

MUCHAS GRACIAS!!!

richi1234

06/7/2012
Me ha servido para entender conceptos
gracias,

Matias

07/11/2012
Acceder a json con un array simple
Hola, cuando me encuentro con un array normal como en este caso:
$miArray = array(1,4,6,8,3,34.8,9,43);
print_r(json_encode($miArray));

Que devuelve:
[1,4,6,8,3,34.8,9,43]

Como deberia de capturarlo mediante javascript?
ya que no tengo indices asociativos y no puedo hacer obj.key

Intenté hacer obj.0 para obtener el 1er valor y no lo pude lograr...
Por favor si alguien me da una ayuda.
Gracias.

h3g0r

23/11/2012
Y si tengo un enorme array?
Esta super el articulo...era la razón de mi problema. El problema en si, esta en que recibo un array del ORM con doctrine. El arreglo llega bien,, con acentos y eñes, pero necesito llevarlo a JSON.
No quiero descomponer el array y aplicarle utf8_encode,. De que manera puedo llevar el arreglo completo a utf8??
Salu2!!

jagarsoft

06/10/2014
Link
FYI
Os será de utilidad!
http://www.jsoneditoronline.org/

SsAx

03/11/2014
Mas legible
Si ustedes quieren ver la notacion JSON mas legible para los mortales yo uso esta sentencia y me funciona bastante bien;

print "<pre>"; print_r($matriz); print "</pre> ";

Con esto mostramos los saltos de linea que comunmente vemos en un Json que lo hacen mas legible, Saludos

thaylor mosquera castro

15/1/2016
crear este array
Hola, alguien podria ayudarme a crear un array de este tipo desde php

{
"current": 1,
"rowCount": 10,
"rows": [
{
"id": 19,
"sender": "123@test.de",
"received": "2014-05-30T22:15:00"
},
{
"id": 14,
"sender": "123@test.de",
"received": "2014-05-30T20:15:00"
},
...
],
"total": 1123
}

Mauricio Alan Gonzalez Razo

05/6/2016
Ignorante de php
Hola es excelente este post, realmente no nada de php me interesa comenzar con apps de android intente trabajar con jdbc desde android pero al parecer no es compatible en fin la duda que tengo es:

$miArray = array("manzana"=>"verde", "uva"=>"Morada", "fresa"=>"roja");
el simbolo => para que sirve me parece qie indica una propiedad del objeto en el array esto significa que asigna una propiedad de ese objeto? como se haria con dto por ejemplo

Daniel

17/11/2016
Genial
Muchas gracias, me ha servido de mucho, muy bien explicado y ejemplificado, como siempre en todos tus artículos!
Gracias por ayudarnos a tantos :)

Eduardo Gomez

24/4/2017
Perfecto
Gracias!

jaciel

10/7/2018
ocupo hacer un json donde muestre datos desde un url
https://api.datos.gob.mx/v1/condiciones-atmosfericas