Formato JSON

Formato JSON

Formato JSON

JSON es un formato de intercambio de datos basado en texto, es decir, es fácil de leer para una persona además de para un programa. Su nombre corresponde con las siglas en inglés de JavaScript Object Notation y está estandarizado como ECMA-404. Aunque es un formato muy cercano en sintaxis a JavaScript, por ser muy sencillo de tratar para codificar datos de objetos o para obtenerlos, se utiliza también en muchos otros lenguajes de programación (C, C++, Java, Python…) como una alternativa, por ejemplo, a XML, que tiene un objetivo similar pero que, por incluir más metainformación, necesita más texto y por tanto ocupa más, consume más ancho de banda y necesita más recursos para codificar y decodificar la información que JSON.

Tabla de contenidos

    Los datos de un objeto codificados en JSON están encerrados entre llaves, las distintas propiedades que se incluyen dentro se separan por comas y los nombres de las propiedades preceden al valor, del que se separan por dos puntos.

    Esquema de la sintaxis de un objeto en formato JSON

    Los nombres de las propiedades deben entrecomillarse usando la doble comilla (aunque algunos parsers admitirán la comilla simple) y pese a que se admiten algunos caracteres especiales para los nombres (como las tildes) no es recomendable para evitar el criterio de algunos motores de análisis y para evitar conflictos al usar la propiedad especialmente con la sitaxis de punto (objeto.propiedad)

    En el ejemplo de arriba puede verse un objeto que tiene seis propiedades con valores sencillos, numéricos, booleanos o de texto; pero en el formato JSON, las propiedades pueden adquirir también como valor un objeto (incluyendo el «objeto especial» null) o una matriz además de una cadena de texto (un texto entre comillas), un número (en diferentes formatos) o un valor booleano (true o false).

    Al igual que ocurre con el lenguaje JavaScript (JSON es un subconjunto de JavaScript) para expresar una matriz se encierran entre corchetes sus valores y se separan por comas. El caso más sencillo se ilustra en el ejemplo de abajo; se trata de una matriz unidimensional, un vector, compuesto por valores numéricos.

    En JavaScript no es necesario que todos los elementos de una matriz sean del mismo tipo, se pueden mezclar, por ejemplo, cadenas de texto y valores numéricos. Un vector, una matriz unidimensional, puede ser también uno de los elementos de otra matriz, lo que permite construir matrices multidimensionales de longitudes variables. El siguiente ejemplo muestra un objeto con tres propiedades: la primera una matriz bidimensional de longitudes fijas, longitudes variables en la segunda y la tercera formada por una matriz con valores de tipos diferentes.

    En el siguiente ejemplo se usan otros objetos como valores de las propiedades del objeto principal. No hay un límite en el nivel de anidamiento así que, a su vez, los objetos que sean valores de propiedades del principal también pueden tener otros objetos como valores de sus propiedades y así sucesivamente.

    Igual que ocurre con JavaScript, para incluir determinados caracteres dentro de una cadena de texto se utilizan los códigos de escape. La forma más genérica consiste en usar códigos unicode expresados con la barra de escape, la letra u y cuatro dígitos hexadecimales con el formato "\u263A" para referirse a ☺ por ejemplo.

    Los caracteres estándar, presentes en la mayoría de los lenguajes (similares a C) son los siguientes

    • Retroceso \b Código ASCII 8 (0x08)
    • Tabulador \t Código ASCII 9 (0x09) Se suele representar como HT (horizontal tabulator)
    • Nueva línea \n Código ASCII 10 (0x0A) Se suele representar como LF (line feed)
    • Nueva página \f Código ASCII 12 (0x0C) Se suele representar como FF (form feed)
    • Retorno \r Código ASCII 13 (0x0D) Se suele representar como CR (carriage return)
    • Comillas \" Código ASCII 34 (0x22)
    • Barra de división \/ Código ASCII 57 (0x2F)
    • Barra invertida \\ Código ASCII 134 (0x5C)
    • Código unicode \uXXXX

    Derivado de C (y relacionado con Unix y similares, como GNU/Linux) el fin de línea suele representarse con \n y es el que debe elegirse en JSON pero es interesante recordar que algunos sistemas operativos prefieren otras alternativas. Windows suele representar con \r\n las terminaciones de línea y Mac OS (antes de que existiera OS X) solía utilizar \r

    Con respecto al formato numérico, la referencia también es JavaScript. El separador decimal es el punto, el guión (ASCII 45 0x2D) se usa como signo negativo y la notación en forma exponencial (notación científica) utiliza E como indicador (que puede ser mayúscula o minúscula)

    Como decía al principio, para usar los datos, que se habrán obtenido como un texto, los diferentes lenguajes de programación disponen de funciones de análisis y asignación. En el siguiente ejemplo se muestra cómo se usarían en JavaScript. Para poder usarlo desde una consola se incluye la asignación de los datos JSON Para evitar posibles errores dependiendo del estándar ECMA que use el intérprete de JavaScript se hace la asignación del objeto JSON en una sola línea. La edición 6 de 2016 (ECMA-262) soporta cadenas multilínea, la edición 5 (hasta 2011) necesita añadir el código de escape \ y en las anteriores hay que resolverlo a mano o usar una única línea.

    Una advertencia para no confundir a los usuarios noveles en JavaScript. Dentro del código JavaScript no es necesario usar una cadena de texto para crear un objeto, en el ejemplo anterior se usa para simular los datos llegados, por ejemplo, desde un servidor. Para asignar a una variable un objeto bastaría con algo como:

    Ese objeto podría convertirse en un texto, por ejemplo, con la función stringify de la siguiente forma:

    El formato JSON es bastante flexible pero, principalmente por estar basado en texto para ser humanamente legible, presenta algunos inconvenientes. El primero, es que necesita más memoria y consume más ancho de banda de lo imprescindible. En los anteriores ejemplos se ha utilizado un formato que pretende ser más legible que económico por lo que no son una muestra de ahorro, aún así hay muchos elementos del formato (llaves, corchetes, comillas…) que seguirían consumiendo recursos frente a la información representada en crudo.

    El segundo inconveniente se plantea al tratar con datos netamente binarios (por ejemplo imágenes) Cuando se trate de porciones pequeñas se puede resolver con lo explicado para resolver el formateo de caracteres especiales pero si se trata de codificar información de ciertas dimensiones será necesario embeberla dentro del formato JSON utilizando otro formato de texto. La codificación más usada para resolver este aspecto es Base64 ya que muchos lenguajes disponen de librerías para convertir la información en una y otra dirección. Si los datos que se manipulan son predominantemente de este tipo y/o no es necesario que una persona interprete sin un programa la información, cabe plantearse si el formato JSON es el más adecuado.

    Publicar comentario

    Puede que te hayas perdido