¿Qué es JSON y cómo se usa?

Publicado: 2022-08-14
Imagen del texto "JSON" superpuesto en un monitor de computadora
María Vonotna/Shutterstock.com

JSON (Notación de objetos de JavaScript) es un formato estandarizado para representar datos estructurados. Aunque JSON surgió del lenguaje de programación JavaScript, ahora es un método omnipresente de intercambio de datos entre sistemas. La mayoría de las API modernas aceptan solicitudes JSON y emiten respuestas JSON, por lo que es útil tener un buen conocimiento práctico del formato y sus características.

En este artículo, explicaremos qué es JSON, cómo expresa diferentes tipos de datos y las formas en que puede producirlos y consumirlos en lenguajes de programación populares. También cubriremos algunas de las limitaciones de JSON y las alternativas que han surgido.

Conceptos básicos de JSON

JSON fue diseñado originalmente por Douglas Crockford como un formato sin estado para comunicar datos entre navegadores y servidores. A principios de la década de 2000, los sitios web comenzaban a obtener datos adicionales de forma asincrónica de su servidor, después de la carga inicial de la página. Como formato basado en texto derivado de JavaScript, JSON simplificó la obtención y el consumo de datos dentro de estas aplicaciones. La especificación finalmente se estandarizó como ECMA-404 en 2013.

JSON siempre se transmite como una cadena. Estas cadenas se pueden decodificar en una variedad de tipos de datos básicos, incluidos números, booleanos, matrices y objetos. Esto significa que las jerarquías y las relaciones de los objetos pueden conservarse durante la transmisión y luego volver a ensamblarse en el extremo receptor de una manera apropiada para el entorno de programación.

Un ejemplo básico de JSON

Esta es una representación JSON de una publicación de blog:

 {
    "identificación": 1001,
    "título": "¿Qué es JSON?",
    "autor": {
        "identificación": 1,
        "nombre": "James Walker"
    },
    "etiquetas": ["api", "json", "programación"],
    "publicado": falso,
    "publishedTimestamp": nulo
}

Este ejemplo demuestra todos los tipos de datos JSON. También ilustra la concisión de los datos con formato JSON, una de las características que los hace tan atractivos para su uso en las API. Además, JSON es relativamente fácil de leer tal cual, a diferencia de formatos más detallados como XML.

Tipos de datos JSON

Seis tipos de datos se pueden representar de forma nativa en JSON:

  • Cadenas : las cadenas se escriben entre comillas dobles; los caracteres se pueden escapar usando barras invertidas.
  • Números : los números se escriben como dígitos sin comillas. Puede incluir un componente fraccionario para indicar un flotador. La mayoría de las implementaciones de análisis de JSON asumen un número entero cuando no hay un punto decimal presente.
  • Booleanos : se admiten los valores literales true y false .
  • Nulo : el valor literal null se puede usar para indicar un valor vacío u omitido.
  • Matrices : una matriz es una lista simple denotada por corchetes. Cada elemento de la lista está separado por una coma. Las matrices pueden contener cualquier cantidad de elementos y pueden usar todos los tipos de datos admitidos.
  • Objetos : los objetos se crean mediante corchetes. Son una colección de pares clave-valor donde las claves son cadenas, entre comillas dobles. Cada clave tiene un valor que puede tomar cualquiera de los tipos de datos disponibles. Puede anidar objetos para crear jerarquías en cascada. Una coma debe seguir a cada valor, lo que significa el final de ese par clave-valor.

Los analizadores JSON convierten automáticamente estos tipos de datos en estructuras apropiadas para su idioma. No necesita convertir manualmente la id en un número entero, por ejemplo. El análisis de toda la cadena JSON es suficiente para volver a asignar los valores a su formato de datos original.

Semántica y Validación

JSON tiene ciertas reglas que deben respetarse cuando codifica sus datos. Los consumidores no podrán analizar las cadenas que no se adhieren a la sintaxis.

Es particularmente importante prestar atención a las comillas alrededor de cadenas y claves de objeto. También debe asegurarse de que se use una coma después de cada entrada en un objeto o matriz. Sin embargo, JSON no permite una coma final después de la última entrada; incluir una sin querer es una causa común de errores de validación. La mayoría de los editores de texto resaltarán los problemas de sintaxis para usted, ayudándole a descubrir errores.

A pesar de estos puntos de falla comunes, JSON es uno de los formatos de datos más fáciles de escribir a mano. La mayoría de las personas encuentran la sintaxis rápida y conveniente una vez que se familiarizan con ella. En general, JSON tiende a ser menos propenso a errores que XML, donde las etiquetas de apertura y cierre no coincidentes, las declaraciones de esquema no válidas y los problemas de codificación de caracteres a menudo causan problemas.

Designación de contenido JSON

La extensión .json normalmente se usa cuando JSON se guarda en un archivo. El contenido JSON tiene el tipo MIME estandarizado application/json , aunque a veces se usa text/json por motivos de compatibilidad. Hoy en día, debe confiar en application/json para los encabezados HTTP de Accept y Content-Type .

La mayoría de las API que usan JSON encapsularán todo en un objeto de nivel superior:

 {
    "error": 1000
}

Sin embargo, esto no es necesario: un tipo literal es válido como nodo de nivel superior en un archivo, por lo que los siguientes ejemplos también son JSON válidos:

 1000 
 verdadero 
 nulo

Se decodificarán a sus respectivos escalares en su lenguaje de programación.

Trabajar con JSON

La mayoría de los lenguajes de programación tienen soporte JSON incorporado. Aquí se explica cómo interactuar con datos JSON en algunos entornos populares.

JavaScript

En JavaScript, los JSON.stringify() y JSON.parse() se utilizan para codificar y decodificar cadenas JSON:

 publicación constante = {
    identificación : 1001 ,
    título : "¿Qué es JSON?" ,
    autor : {
        identificación : 1 ,
        nombre : "James Walker"
    }
} ;

const codificadoJson = JSON. stringificar ( publicar ) ;

// {"id": 1001, "título": "¿Qué es JSON?", ...}
consola. registro ( encodedJson ) ;

const decodificadoJson = JSON. analizar ( encodedJson ) ;

// James Walker
consola. log ( decodedJson. autor . nombre ) ;

PHP

Las funciones equivalentes en PHP son json_encode() y json_decode() :

 $publicación = [
    "id" => 1001 ,
    "título" => "¿Qué es JSON?" ,
    "autor" => [
        "id" => 1 ,
        "nombre" => "James Walker"
    ]
] ;

$encodedJson = json_encode ( $post ) ;

// {"id": 1001, "título": "¿Qué es JSON?", ...}
echo $codificadoJson ;

$decodedJson = json_decode ( $encodedJson , true ) ;

// James Walker
echo $decodedJson [ "autor" ] [ "nombre" ] ;

Pitón

Python proporciona json.dumps() y json.loads() para serializar y deserializar respectivamente:

 importar json

publicar = {
    "identificación" : 1001 ,
    "título" : "¿Qué es JSON?" ,
    "autor" : {
        "identificación" : 1 ,
        "nombre" : "James Walker"
    }
}

codificadoJson = json. vertederos ( post )

# {"id": 1001, "título": "¿Qué es JSON?", ...}
imprimir ( encodedJson )

decodificadoJson = json. cargas ( encodedJson )

#james walker
imprimir ( decodedJson [ "autor" ] [ "nombre" ] )

Rubí

Ruby ofrece JSON.generate y JSON.parse :

 requiere "json"

publicar = {
    "id" => 1001 ,
    "título" => "¿Qué es JSON?" ,
    "autor" => {
        "id" => 1 ,
        "nombre" => "James Walker"
    }
}

codificadoJson = JSON. generar ( publicar )

# {"id": 1001, "título": "¿Qué es JSON?", ...}
pone Json codificado

decodificadoJson = JSON. analizar ( encodedJson )

#james walker
pone decodedJson [ "autor" ] [ "nombre" ]

Limitaciones de JSON

JSON es un formato liviano que se enfoca en transmitir los valores dentro de su estructura de datos. Esto hace que sea rápido de analizar y fácil de usar, pero significa que hay inconvenientes que pueden causar frustración. Estos son algunos de los mayores problemas.

Sin comentarios

Los datos JSON no pueden incluir comentarios. La falta de anotaciones reduce la claridad y lo obliga a colocar la documentación en otro lugar. Esto puede hacer que JSON no sea adecuado para situaciones como archivos de configuración, donde las modificaciones son poco frecuentes y los propósitos de los campos pueden no estar claros.

Sin esquemas

JSON no le permite definir un esquema para sus datos. No hay forma de hacer cumplir que id es un campo entero obligatorio, por ejemplo. Esto puede dar lugar a estructuras de datos con formato incorrecto involuntario.

Sin referencias

Los campos no pueden hacer referencia a otros valores en la estructura de datos. Esto a menudo provoca repeticiones que aumentan el tamaño del archivo. Volviendo al ejemplo de publicación de blog de antes, podría tener una lista de publicaciones de blog de la siguiente manera:

 {
    "publicaciones": [
        {
            "identificación": 1001,
            "título": "¿Qué es JSON?",
            "autor": {
                "identificación": 1,
                "nombre": "James Walker"
            }
        },
        {
            "identificación": 1002,
            "title": "¿Qué es SaaS?",
            "autor": {
                "identificación": 1,
                "nombre": "James Walker"
            }
        }
    ]
}

Ambos posts tienen el mismo autor pero se ha tenido que duplicar la información asociada a ese objeto. En un mundo ideal, las implementaciones del analizador JSON podrían producir la estructura que se muestra arriba a partir de una entrada similar a la siguiente:

 {
    "publicaciones": [
        {
            "identificación": 1001,
            "título": "¿Qué es JSON?",
            "autor": "{{ .autores.james }}"
        },
        {
            "identificación": 1002,
            "title": "¿Qué es SaaS?",
            "autor": "{{ .autores.james }}"
        }
    ],
    "autores": {
        "James": {
            "identificación": 1,
            "nombre": "James Walker"
        }
    }
}

Esto no es posible actualmente con JSON estándar.

Sin tipos de datos avanzados

Los seis tipos de datos admitidos omiten muchos tipos comunes de valor. JSON no puede almacenar fechas, horas o puntos de geolocalización de forma nativa, por lo que debe decidir su propio formato para esta información.

Esto provoca discrepancias inconvenientes y casos extremos. Si su aplicación maneja marcas de tiempo como cadenas, como 2022-07-01T12:00:00+00:00 , pero una API externa presenta el tiempo como segundos después de la época de Unix ( 1657287000 ), deberá recordar cuándo usar cada uno de los formatos.

Alternativas JSON

YAML es la alternativa JSON líder. Es un superconjunto del formato que tiene una presentación más legible por humanos, tipos de datos personalizados y soporte para referencias. Está destinado a abordar la mayoría de los desafíos de usabilidad asociados con JSON.

YAML ha visto una amplia adopción para archivos de configuración y dentro de DevOps, IaC y herramientas de observabilidad. Se usa con menos frecuencia como formato de intercambio de datos para las API. La relativa complejidad de YAML significa que es menos accesible para los recién llegados. Pequeños errores de sintaxis pueden causar errores de análisis confusos.

Los búferes de protocolo (protobufs) son otro competidor JSON emergente diseñado para serializar datos estructurados. Los protobufs tienen declaraciones de tipos de datos, campos obligatorios y soporte para la mayoría de los principales lenguajes de programación. El sistema está ganando popularidad como una forma más eficiente de transmitir datos a través de redes.

Resumen

JSON es un formato de representación de datos basado en texto que puede codificar seis tipos de datos diferentes. JSON se ha convertido en un elemento básico del ecosistema de desarrollo de software; es compatible con todos los principales lenguajes de programación y se ha convertido en la opción predeterminada para la mayoría de las API REST desarrolladas durante las últimas dos décadas.

Si bien la simplicidad de JSON es parte de su popularidad, también impone limitaciones sobre lo que puede lograr con el formato. La falta de soporte para esquemas, comentarios, referencias de objetos y tipos de datos personalizados significa que algunas aplicaciones encontrarán que superan lo que es posible con JSON. Las alternativas más jóvenes, como YAML y Protobuf, han ayudado a abordar estos desafíos, mientras que XML sigue siendo un competidor para las aplicaciones que desean definir un esquema de datos y no les importa la verbosidad.