Llegamos a ustedes gracias a:



Reportajes y análisis

¿Qué es JSON? El formato de datos universal

[18/09/2022] JSON, o JavaScript Object Notation, es un formato utilizado para representar datos. Se introdujo a principios de la década de los años 2000 como parte de JavaScript, y se expandió gradualmente hasta convertirse en el medio más común para describir e intercambiar datos basados en texto. Hoy, JSON es el estándar universal de intercambio de datos. Se encuentra en todas las áreas de la programación, incluido el desarrollo front end y del lado del servidor, los sistemas, el middleware y las bases de datos.

[Reciba lo último de CIO Perú suscribiéndose a nuestro newsletter semanal]

Este artículo es una introducción a JSON. Obtendrá una descripción general de la tecnología, descubrirá cómo se compara con estándares similares como XML, YAML y CSV, y verá ejemplos de JSON en una variedad de programas y casos de uso.

Un poco de historia

JSON se desarrolló inicialmente como un formato para la comunicación entre clientes de JavaScript y servidores back end. Rápidamente, ganó popularidad como un formato legible por humanos que los programadores de front end podían usar para comunicarse con el back end usando un formato conciso y estandarizado. Los desarrolladores también descubrieron que JSON era muy flexible: podía agregar, quitar y actualizar campos ad hoc. (Esa flexibilidad se produjo a costa de la seguridad, que luego se abordó con el esquema JSON).

En un giro curioso, JSON fue popularizado por la revolución AJAX. Extraño, dado el énfasis en XML, pero fue JSON lo que hizo que AJAX realmente brillara. El uso de REST como la convención para las API y JSON como medio de intercambio demostró ser una potente combinación para equilibrar la simplicidad, la flexibilidad y la coherencia.

A continuación, JSON se propagó desde el front end de JavaScript hasta la comunicación cliente-servidor, y posteriormente a los archivos de configuración del sistema, los lenguajes de back end y hasta las bases de datos. JSON incluso ayudó a impulsar el movimiento NoSQL que revolucionó el almacenamiento de datos. Resultó que los administradores de bases de datos también disfrutaron de la flexibilidad y la facilidad de programación de JSON.

Hoy en día, los almacenes de datos orientados a documentos como MongoDB proporcionan una API que funciona con estructuras de datos similares a JSON. En una entrevista, a principios del 2022, el CTO de MongoDB, Mark Porter, señaló que, desde su perspectiva, JSON todavía está expandiendo la frontera de los datos. No está mal para un formato de datos que comenzó con una humilde llave y dos puntos.

Por qué los desarrolladores usan JSON

No importa en qué tipo de programa o caso de uso estén trabajando, los desarrolladores de software necesitan una forma de describir e intercambiar datos. Esta necesidad se encuentra en bases de datos, lógica empresarial, interfaces de usuario y en todos los sistemas de comunicación. Existen muchos enfoques destinados a estructurar datos para el intercambio. Los dos grandes campos son los datos binarios y los basados en texto. JSON es un formato basado en texto, por lo que es legible tanto por personas como por máquinas.

JSON es una forma muy exitosa de formatear datos por varias razones. Primero, es nativo de JavaScript y se usa dentro de los programas de JavaScript como literales JSON. También puede usar JSON con otros lenguajes de programación, por lo que es útil para el intercambio de datos entre sistemas heterogéneos. Finalmente, es legible por humanos. Para una estructura de datos de lenguaje, JSON es una herramienta increíblemente versátil. También es bastante fácil de usar, especialmente cuando se compara con otros formatos.

Cómo funciona JSON

Cuando ingresa su nombre de usuario y contraseña en un formulario en una página web, está interactuando con un objeto con dos campos: nombre de usuario y contraseña. Como ejemplo, considere la página de inicio de sesión en la Figura 1.

Figura 1. Una página de inicio de sesión simple.
JSON, formato datos universal, JavaScript

El Listado 1 muestra esta página descrita usando JSON.

Listado 1. JSON para una página de inicio de sesión

{
   username: "Bilbo Baggins,
   password: "fkj3442jv9dwwf
}

Todo lo que está dentro de las llaves o corchetes ondulados ( {...} ) pertenece al mismo objeto. Un objeto, en este caso, se refiere, en el sentido más general, a una "cosa única. Dentro de las llaves están las propiedades que pertenecen a la cosa. Cada propiedad tiene dos partes: un nombre y un valor, separados por dos puntos. Estos se conocen como claves y valores. En el Listado 1, "username es una clave y "Bilbo Baggins es un valor.

Propiedades, campos y atributos

Cada uno de estos elementos se utiliza para hacer referencia a las partes de un objeto JSON. Técnicamente, en el contexto de un lenguaje de programación orientado a objetos, se denominan miembros. Cada propiedad, campo o atributo es miembro de un objeto.

La conclusión clave aquí es que JSON hace todo lo necesario para manejar la necesidad --en este caso, de mantener la información en el formulario-- sin requerir demasiada información adicional. Puede echar un vistazo a este archivo JSON y entenderlo. Por eso decimos que JSON es conciso. Su naturaleza concisa también hace que JSON sea un excelente formato para enviar por cable.

JSON frente a XML

JSON se creó como una alternativa a XML, que alguna vez fue el formato dominante para el intercambio de datos. El formulario de inicio de sesión en el Listado 2 se describe utilizando XML.

Listado 2. Formulario de inicio de sesión en XML

<UserLogin>
  <Username>Samwise Gamgee</Username>
  <Password>ghB5fK5</Password>
</UserLogin>

Solo mirar este formulario es agotador. Imagine tener que crearlo y analizarlo en código. Por el contrario, usar JSON en JavaScript es muy simple. Pruébelo. Presione F12 en su navegador para abrir una consola de JavaScript, luego pegue el JSON que se muestra en el Listado 3.

Listado 3. Uso de JSON en JavaScript

let hobbitJson = {
    name: "Pippin",
    hometown: "Shire"
}
console.log(hobbitJson.name);  // outputs "Pippin
hobbitJson.bestFriend = "Merry";  // modify the object
console.log(JSON.stringify(hobbitJson)); //output entire object
// {"name":"Pippin","hometown":"Shire","bestFriend":"Merry"}

XML es difícil de leer y deja mucho que desear en términos de agilidad de codificación. JSON se creó para resolver estos problemas. No es de extrañar que haya suplantado, más o menos, a XML.

JSON frente a YAML y CSV

Dos formatos de datos, que a veces se comparan con JSON, son YAML y CSV. Los dos formatos están en extremos opuestos del espectro temporal. CSV es un formato antiguo, previo a la era digital, que eventualmente encontró su camino para ser utilizado en las computadoras. YAML se inspiró en JSON y es algo así como su descendiente conceptual.

CSV es una lista simple de valores, con cada entrada indicada por una coma u otro carácter separador, con una primera fila opcional de campos de encabezado. Es bastante limitado como medio de intercambio y estructura de programación, pero sigue siendo útil para enviar grandes cantidades de datos al disco. Y, por supuesto, la organización de datos tabulares de CSV es perfecta para cosas como las hojas de cálculo.

YAML es, en realidad, un conjunto superior de JSON, lo que significa que soportará todo lo que soporta JSON. Pero YAML también soporta una sintaxis más simplificada, que pretende ser incluso más concisa que JSON. Por ejemplo, YAML usa sangría para la jerarquía, renunciando a las llaves. Aunque YML a veces se usa como formato de intercambio de datos, su mayor caso de uso es en los archivos de configuración.

¿Es YAML mejor que JSON? Consulte ¿Cuál es la diferencia entre YAML y JSON? para obtener más información sobre cómo se comparan estos estándares.

JSON complejo: Anidamiento, objetos y matrices

Hasta ahora, solo ha visto ejemplos de JSON utilizados con objetos poco profundos (o simples). Eso solo significa que cada campo en el objeto tiene el valor de un primitivo. JSON también es capaz de modelar estructuras de datos complejas y arbitrarias, como gráficos de objetos y gráficos cíclicos, es decir, estructuras con referencias circulares. En esta sección, verá ejemplos de modelado complejo mediante anidamiento, referencias a objetos y matrices.

JSON con objetos anidados: el Listado 4 muestra cómo definir objetos JSON anidados.

Listado 4. JSON anidado

let merry = { name: "Merry",
  bestfriend: {
    name: "Pippin"
  }
} 

La propiedad bestfriend en el Listado 4 se refiere a otro objeto, que se define en línea como un JSON literal.

JSON con referencias a objetos: ahora considere el Listado 5, donde en lugar de tener un nombre en la propiedad bestfriend, mantenemos una referencia al objeto real.

Listado 5. Una referencia de objeto

let merry = { race: "hobbit", name: "Merry Brandybuck }
let pippin = {race: "hobbit", name: "Pippin Took, bestfriend: merry }
console.log(JSON.stringify(pippin.bestfriend.name)); // outputs "Merry Brandybuck

En el Listado 5, colocamos el identificador del objeto merry en la propiedad bestfriend. Luego, podemos obtener el objeto merry real del objeto pippin a través de la propiedad bestfriend. Obtuvimos el nombre del objeto merry con la propiedad name. A esto se le llama atravesar el gráfico de objetos, lo cual se hace usando el operador de punto.

JSON con arreglos: Otro tipo de estructura que pueden tener las propiedades JSON son los arreglos. Estos se parecen a los arreglos de JavaScript y se indican con un corchete, como se muestra en el Listado 6.

Listado 6. Una propiedad de matriz

{
  towns: [ "The Shire, "Rivendale, "Gondor ]
}

Por supuesto, las matrices también pueden contener referencias a otros objetos. Con estas dos estructuras, JSON puede modelar cualquier rango de relaciones de objetos complejas.

Resumen de tipos de valor JSON: hasta ahora, ha visto cadenas, objetos y matrices como tipos de valor. Los tipos de valores adicionales para las propiedades JSON son cadena, número, objeto, matriz, verdadero, falso y nulo.

Analizar y generar JSON

Analizar y generar JSON significa leerlo y crearlo, respectivamente. Ya ha visto JSON.stringify() en acción. Ese es el mecanismo incorporado para que los programas de JavaScript tomen una representación de objeto en memoria y la conviertan en una cadena JSON. Para ir en la otra dirección, es decir, tomar una cadena JSON y convertirla en un objeto en memoria, use JSON.parse().

En la mayoría de los demás lenguajes, es necesario utilizar una biblioteca de terceros para analizar y generar. Por ejemplo, en Java existen numerosas bibliotecas, pero las más populares son Jackson y GSON. Estas bibliotecas son más complejas que stringify y parse en JavaScript, pero también ofrecen capacidades avanzadas como el mapeo hacia y desde tipos personalizados y el manejo de otros formatos de datos.

En JavaScript, es común enviar y recibir JSON a los servidores. Por ejemplo, con la API fetch() incorporada. Al hacerlo, puede analizar automáticamente la respuesta, como se muestra en el Listado 7.

Listado 7. Análisis de una respuesta JSON con fetch()

fetch('https://the-one-api.dev/v2/character')
  .then((response) => response.json())
  .then((data) => console.log(data));

Una vez que convierte JSON en una estructura de datos en memoria, ya sea JavaScript u otro lenguaje, puede emplear las API para manipular la estructura. Por ejemplo, en JavaScript, se accedería al JSON analizado en el Listado 7 como a cualquier otro objeto de JavaScript, tal vez recorriendo data.keys o acceder a propiedades conocidas en el objeto de datos.

JWT: la autenticación es otra área donde se usa JSON. Los desarrolladores y otros usan tokens web JSON, o JWTs, para comunicar reclamos de autenticación. Los JWT tienen un formato compacto estándar y están firmados criptográficamente para evitar la manipulación. También se pueden cifrar para mantener el secreto.

Esquema JSON y formateador JSON

JavaScript y JSON son increíblemente flexibles, pero a veces se necesita más estructura de la que proporcionan. En un lenguaje como Java, la tipificación fuerte y los tipos abstractos (como las interfaces) ayudan a estructurar los programas a gran escala. En los almacenes de SQL, un esquema proporciona una estructura similar. Si usted necesita más estructura en sus documentos JSON, puede usar el esquema JSON para definir explícitamente las características de sus objetos JSON. Una vez definido, puede usar el esquema para validar instancias de objetos y asegurarse de que se ajusten al esquema.

Otro problema es lidiar con JSON procesado por máquina, que está minimizado e ilegible. Afortunadamente, este problema es fácil de resolver. Simplemente vaya al JSON Formatter & Validator (me gusta esta herramienta, pero existen otras), pegue su JSON y presione el botón Procesar. Verá una versión legible por humanos que puede usar. La mayoría de los IDE también tienen un formateador de JavaScript incorporado para formatear su JSON.

Usar JSON con TypeScript

TypeScript permite definir tipos e interfaces, por lo que hay momentos en los que es útil usar JSON con TypeScript. Una clase, al igual que un esquema, describe las propiedades aceptables de una instancia de un tipo determinado. En JavaScript simple, no hay forma de restringir las propiedades y sus tipos. Las clases de JavaScript son como sugerencias; el programador puede configurarlas ahora y modificar el JSON más tarde. Sin embargo, una clase de TypeScript impone qué propiedades puede tener el JSON y qué tipos pueden ser.

Conclusión

JSON es una de las tecnologías más esenciales utilizadas en el panorama del software moderno. Es crucial para JavaScript, pero también se usa como un modo común de interacción entre una amplia gama de tecnologías. Afortunadamente, lo que hace que JSON sea tan útil lo hace relativamente fácil de entender. Es un formato conciso y legible para representar datos textuales.