JSON (JavaScript Object Notation)
es un formato de datos derivado de la notación de objetos de JavaScript. Pero es independiente del lenguaje, lo que significa que muchos lenguajes de programación, incluidos C++, Python, entre otros, pueden leer y generar datos en formato JSON.
Este formato es especialmente útil porque es fácil de entender tanto para humanos como para máquinas.
En la práctica, JSON se utiliza para representar datos como estructuras de objetos similares a los de JavaScript, lo que facilita su manipulación y acceso. Cuando se necesitan estos datos, simplemente se convierten de la estructura JSON a un objeto nativo del lenguaje en uso, como JavaScript.
Javascript tiene funciones integradas para convertir una cadena JSON a objetos Javascript con JSON.parse()
y viceversa, convertir un objeto en una cadena JSON, con JSON.stringify()
. Esto nos permite almacenar datos en formato de texto.
Los objetos están dentro de llaves y los arrays dentro de corchetes [].
Los datos JSON se escriben como pares de clave/valor.
Las claves deben estar entre comillas dobles y debe ser única en cada estructura de objeto.
Los valores pueden ser de tipo string, número, objeto, arreglo, booleano o null. Si es un string, también debe ir entre comillas dobles y si es un número no debe tener ceros a la izquierda. Pero no pueden ser de tipo función, fecha ni undefined.
Los caracteres especiales, como utilizar una comilla doble en un string, necesitan ser escapados utilizando el carácter de barra invertida \
.
Los datos deben estar separados por comas, excepto el último.
El tipo de archivo para archivos JSON es .json y el tipo MIME para el texto JSON es "application/json".
JSON no admite comentarios, por lo que cualquier comentario en un archivo JSON causará un error.
Dado que la sintaxis de los datos JSON derivan de los objetos de Javascript, al parsear un json, se puede trabajar fácilmente con los datos. Aunque no hay que cometer el error de creer que un JSON es un objeto, sino que es un formato de cadena y recién al convertirlo en una variable de Javascript es un objeto de Javascript.
Un dato interesante es que JSON no permite funciones como valores. Pero de ser necesario, se escribe la función como string y luego se utiliza la función eval() para obtenerla nuevamente.
La función eval()
en JavaScript es una función global que evalúa un string como código JavaScript y ejecuta las instrucciones que contiene ese string.
Aunque es una herramienta poderosa, su uso es ampliamente desaconsejado por varias razones, principalmente debido a cuestiones de seguridad, al poder verse afectado por un elemento malicioso que terminará siendo ejecutado; y de rendimiento, ralentizando la ejecución del programa, especialmente si se usa repetidamente."
Por otro lado, si estamos trabajando con un objeto de Javascript donde un valor es de tipo función y utilizamos JSON.stringify(), entonces se eliminará tanto la clave como el valor, por lo que se debería convertir la función en string (podemos usar toString()) antes de ejecutar JSON.stringify().
De la misma manera, JSON no admite fechas como tipo de dato. Si necesitamos trabajar este tipo, se escribe la fecha como string y luego creamos la nueva fecha.
Al trabajar con un objeto de Javascript donde tenemos un valor de tipo fecha y utilizamos JSON.stringify(), el valor se convertirá en un string con el valor de la fecha.
Al almacenar datos, es crucial que estos se encuentren en un formato específico. Una de las formas más universales y aceptadas para guardar información es en formato de texto. JSON facilita el almacenamiento de objetos de JavaScript en forma de texto. Esto no solo asegura la compatibilidad entre diferentes sistemas y plataformas, sino que también simplifica el proceso de intercambio y manipulación de datos en aplicaciones web y móviles.
Veamos un ejemplo de almacenamiento en el localStorage.
Ahora recuperemos este dato desde el localStorage:
Como hemos visto, los datos en formato JSON se pueden convertir a objetos de JavaScript. Esto nos permite utilizarlos para insertar HTML dinámicamente en una página web. Para obtener estos datos JSON, empleamos XMLHttpRequest
, que facilita la realización de solicitudes al servidor permitiendo actualizar secciones específicas de la página sin necesidad de recargar completamente.
Los errores de sintaxis en archivos JSON son comunes, sobre todo cuando trabajamos con archivos extensos, y pueden causar que la lectura del archivo falle completamente. Un archivo JSON debe seguir una estructura muy específica: los objetos están encerrados en llaves , los arrays en corchetes [], y las cadenas, claves y valores numéricos están separados por comas. Además, todas las claves deben estar en comillas dobles. Un error tan simple como olvidar una coma, repetir una clave dentro de una misma estructura de objeto, usar comillas simples en lugar de comillas dobles, o añadir una coma extra al final del último elemento de un objeto o array, puede resultar en un error de sintaxis que impide que el archivo JSON sea parseado correctamente. Estos errores son críticos porque el formato JSON es estrictamente riguroso y no permite desviaciones en su estructura definida.
Para detectar y corregir rápidamente errores de sintaxis en archivos JSON, o simplemente para validar su estructura, es recomendable utilizar herramientas especializadas que faciliten este proceso. Herramientas en línea como JSONLint Validator and Formatter
son muy útiles, ya que no solo validan el JSON conforme a los estándares de JavaScript, sino que también indican con precisión los errores por línea. Alternativamente, se pueden integrar bibliotecas como Another JSON Schema Validator (AJV)
directamente en nuestros proyectos. AJV permite asegurar que los datos sean validados de manera inmediata y precisa en el momento de su recepción, lo cual agiliza el desarrollo y mejora la calidad del software.
Otra opción es validar de manera manual nuestro código de manera sencilla mediante el uso de try y catch en Javascript.
Vamos a cargar un archivo myJson.json de ejemplo:
Creamos un Input de tipo archivo, que en este caso solo aceptará archivos JSON con accept=".json"
y usaremos el useState para manejar el estado del contenido del archivo.
Luego para leer el archivo creamos la función readFile. En esta función usamos el objeto FileReader
que es una API proporcionada por JavaScript que permite a las aplicaciones web leer el contenido de archivos almacenados en el sistema del usuario de manera asíncrona. Uno de sus métodos, readAsText
, se utiliza para leer el contenido de un archivo como una cadena de texto, especificando opcionalmente la codificación (como 'UTF-8'). Una vez que el contenido del archivo se ha leído exitosamente, se dispara el evento onload
, el cual puede ser manejado mediante una función que procesa el resultado de la lectura (accesible a través de e.target.result). Este proceso permite cargar y manipular datos de archivos locales dentro de aplicaciones web sin necesidad de enviarlos a un servidor.
En el evento onload guardaremos el contenido del archivo en el state que definimos al principio.
Teniendo el contenido disponible en el estado podemos editarlo como un objeto de Javascript, por ejemplo, agreguemos los hobbies de John Doe:
Agregamos un botón para descargar el archivo con la función downloadJson. En esta función tenemos:
➖ JSON.stringify(myJSON)
con el que convertimos el objeto myJSON en una cadena JSON.
➖ Usamos encodeURIComponent
para asegurar que la cadena JSON esté correctamente codificada para URL.
➖ El elemento de enlace temporario a
crea dinámicamente un enlace con los atributos href
y download
. href contiene la dirección del archivo JSON y
download especifica el nombre del archivo que se descargará.
➖ El evento click()
simula un clic en el enlace para iniciar la descarga.
➖ El evento remove()
elimina el enlace del documento después de iniciar la descarga para limpiar.
Al hacer clic en el botón, se debería iniciar la descarga del archivo myJSON.json que contiene el objeto JSON especificado.
JSON es altamente valorado por su claridad y facilidad de manejo tanto para humanos como para máquinas, facilitando el intercambio de datos en la web y aplicaciones móviles. Las funcionalidades integradas en JavaScript, como JSON.parse() y JSON.stringify(), simplifican la conversión entre cadenas JSON y objetos JavaScript, permitiendo un almacenamiento eficaz en formato de texto.
Sin embargo, es crucial manejar correctamente la sintaxis de JSON, ya que errores menores pueden causar fallos en el parseo del archivo. Para evitar y corregir estos errores, herramientas como JSONLint Validator and Formatter o Another JSON Schema Validator (AJV), nos ayudan a validar la estructura del JSON contra los estándares de JavaScript.
JSONLint Validator and Formatter