Cómo crear objetos JSON en PHP o en JavaScript

By clcanela, 7 September, 2018

Continuando con el tema de JSON, vamos a ver un ejemplo sencillo de como dar formato a distintos valores y objetos en PHP y en JavaScript (sin jQuery), en ambos casos usaré el mismo ejemplo para que quede más claro las diferencias y las similitudes que hay entre ambos al momento de formar una cadeja JSON.

Comencemos con lo más fácil, los primitivos (number, boolean, string):

PHP
$numero = 25.05;
$buleano = true;
$cadena = "Bollillo";
$nulo = null;
print json_encode($numero); // 25.05
print json_encode($buleano); // true
print json_encode($cadena); // "Bollillo"
print json_encode($nulo); // null

Para armar una cadeja JSON en PHP, hacemos uso de la función json_encode

JavaScript
var numero = 25.05
var buleano = true
var cadena = "Bollillo"
var nulo = null;
JSON.stringify(numero) // 25.05
JSON.stringify(buleano) // true
JSON.stringify(cadena) // "Bollillo"
JSON.stringify(nulo) // null

En JavaScript, hacemos uso de la funcion stringify de la clase nativa JSON (IE8+)

Como podemos notar, al momento de imprimir la cadena en ambos lenguajes se incluyen las comillas, ésto se debe a que internamente, el parser JSON de cada lenguaje interpreta las cadenas como un conjunto de caractéres encerrados entre comillas. En el caso de los demás primitivos el valor devuelto es igual, de ésta forma, cualquier intérprete que lea la cadena JSON, sabrá que son valores primitivos y los tratará como tal, ya que por ejemplo se devolviera "true" el intérprete lo tomaría como una cadena cuyo contenido lee "true", no como una buleana con valor verdadero.

Pasemos ahora a los otros dos tipos de datos que acepta JSON, arreglos y objetos

PHP
$arreglo = array("uno","dos","tres");
$arregloIndexado = array('cuatro'=>4,'cinco'=>5,'seis'=>6);
$arregloAnidado = array('v1'=>"cinnamon",'interno'=>array(1,2,3,'cuatro'),'variable'=>$arreglo);
print json_encode($arreglo); // ["uno","dos","tres"]
print json_encode($arregloIndexado); // {"cuatro":4,"cinco":5,"seis":6}
print json_encode($arregloAnidado); // {"v1":"cinnamon","interno":[1,2,3,"cuatro"],"variable":["uno","dos","tres"]}
$objeto = new stdClass();
$objeto->propiedad = "valor";
$objeto->otraPropiedad = "otro valor";
$objeto->numero = 52.50;
$objeto->arreglo = array('u','d','t');
print json_encode($objeto); // {"propiedad":"valor","otraPropiedad":"otro valor","numero":52.5,"arreglo":["u","d","t"]}

La primera variable es un arreglo básico, al momento de codificarlo a json, vemos que se da formato con los valores del arreglo encerrado entre [corchetes]. A diferencia del anterior, la variable $arregloIndexado no usa el formato con corchetes, si no que lo cambia por {llaves}, esto se debe a que en el formato JSON, no existen como tal los arreglos indexados, ésto debido a que tampoco JavaScript soporta arreglos indexados ni con llaves (recordemos que el formato JSON está basado en JavaScript) es por eso que lo 'convierte' en un objeto y lo imprime en el formato json para objeto. Lo mismo sucede para $arregloAnidado donde al contener llaves, se imprime con formato de objeto json, sólo que aquí podemos observar cómo el atributo de nombre interno sí se imprime con el formato json para arreglo normal, pues es un arreglo no indexado (sin llaves).

Ahora, con respecto a los objetos, se define la variable $objeto la cual tiene varios atributos: propiedad, otraPropiedad, numero y arreglo, cuyos valores podemos ver que se respetan al ser primitivos similares al ejemplo anterior, incluído el arreglo, pues como no tiene índices, se respeta el formato de arreglo en corchetes, de otra forma, ése valor también se hubiese codificado como un objeto con atributos-valores en lugar de sus índices. El formato de objeto en JSON es exactament el mismo que el de un arreglo indexado, ya que no existe ese tipo de dato en JSON.

JavaScript
var arreglo = ["uno","dos","tres"]
var arregloIndexado = {'cuatro':4,'cinco':5,'seis':6}
var arregloAnidado = {'v1':"cinnamon",'interno':[1,2,3,"cuatro"],'variable':arreglo}
JSON.stringify(arreglo) // ["uno","dos","tres"]
JSON.stringify(arregloIndexado) // {"cuatro":4,"cinco":5,"seis":6}
JSON.stringify(arregloAnidado) // {"v1":"cinnamon","interno":[1,2,3,"cuatro"],"variable":["uno","dos","tres"]}
var objeto = {}
objeto.propiedad = "valor"
objeto.otraPropiedad = "otra valor"
objeto.numero = 52.50
objeto.arreglo = ['u','d','t']
JSON.stringify(objeto) // {"propiedad":"valor","otraPropiedad":"otra valor","numero":52.5,"arreglo":["u","d","t"]}

Por parte de JavaScript, el resultado es básicamente el mismo, el arreglo básico se imprime con [corchetes] mientras que el indexado en {llaves}, lo que cabe la pena notar aquí es que desde un inicio el "arreglo indexado" se crea con la sintáxis de un objeto, ésto es por que los arreglos indexados no existen en JavaScript y por ende, tampoco en JSON, más info aquí

Es importante notar que, sin importar que lo codifiquemos en JavaScript o en PHP, la cadena devuelta es exactamente igual, ésto es de esperarse, pues al ser un estándar para el envío y recepción de información, las cadenas creadas deben ser iguales, sin importar el lenguaje en que se generaron.

Para terminar, una duda que he notado mucha gente tiene: ¿cómo mando varios objetos en JSON? o lo que es lo mismo ¿cómo envío varios JSON? la respuesta corta es: no es posible, una respuesta JSON espera que se inicie y termine una cadena JSON 'bien formada'. la respuesta larga es: combina tus objetos a devolver en una gran cadena JSON y asignales a cada uno una etiqueta para que el script que lo reciba pueda leer cada elemento según lo necesite

Comments

Powered by Drupal