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

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.

Índice de contenidos
  1. Conceptos básicos de JSON
  2. Un ejemplo básico de JSON
  3. Tipos de datos JSON
  4. Semántica y Validación
  5. Designación de contenido JSON
  6. Trabajar con JSON
    1. JavaScript
    2. PHP
    3. Pitón
    4. Rubí
  7. Limitaciones de JSON
    1. Sin esquemas
    2. Sin referencias
    3. Sin tipos de datos avanzados
  8. Alternativas JSON
  9. Resumen

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 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:

{
    "id": 1001,
    "title": "What is JSON?",
    "author": {
        "id": 1,
        "name": "James Walker"
    },
    "tags": ["api", "json", "programming"],
    "published": false,
    "publishedTimestamp": null
}

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:

  • Instrumentos de cuerda - 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 - Los valores literales true y false son compatibles.
  • Nulo - Los null El valor literal se puede utilizar para indicar un valor vacío u omitido.
  • arreglos - 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 es necesario enviar manualmente id a un número entero, por ejemplo. Analizar toda la cadena JSON es suficiente para 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 objetos. También debe asegurarse de que se use una coma después de cada entrada en un objeto o matriz. JSON no sin embargo, permita 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

los .json La extensión se usa normalmente cuando JSON se guarda en un archivo. El contenido JSON tiene el tipo MIME estandarizado application/jsona pesar de que text/json se utiliza a veces por razones de compatibilidad. Hoy en día debes confiar en application/json por Accept y Content-Type Encabezados HTTP.

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

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:

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 el JSON.stringify() y JSON.parse() Los métodos se utilizan para codificar y decodificar cadenas JSON:

const post = {
    id: 1001,
    title: "What Is JSON?",
    author: {
        id: 1,
        name: "James Walker"
    }
};
 
const encodedJson = JSON.stringify(post);
 
// {"id": 1001, "title": "What Is JSON?", ...}
console.log(encodedJson);
 
const decodedJson = JSON.parse(encodedJson);
 
// James Walker
console.log(decodedJson.author.name);

PHP

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

$post = [
    "id" => 1001,
    "title" => "What Is JSON?",
    "author" => [
        "id" => 1,
        "name" => "James Walker"
    ]
];
 
$encodedJson = json_encode($post);
 
// {"id": 1001, "title": "What Is JSON?", ...}
echo $encodedJson;
 
$decodedJson = json_decode($encodedJson, true);
 
// James Walker
echo $decodedJson["author"]["name"];

Pitón

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

import json
 
post = {
    "id": 1001,
    "title": "What Is JSON?",
    "author": {
        "id": 1,
        "name": "James Walker"
    }
}
 
encodedJson = json.dumps(post)
 
# {"id": 1001, "title": "What Is JSON?", ...}
print(encodedJson)
 
decodedJson = json.loads(encodedJson)
 
# James Walker
print(decodedJson["author"]["name"])

Rubí

Ofertas rubí JSON.generate y JSON.parse:

require "json"
 
post = {
    "id" => 1001,
    "title" => "What Is JSON?",
    "author" => {
        "id" => 1,
        "name" => "James Walker"
    }
}
 
encodedJson = JSON.generate(post)
 
# {"id": 1001, "title": "What Is JSON?", ...}
puts encodedJson
 
decodedJson = JSON.parse(encodedJson)
 
# James Walker
puts decodedJson["author"]["name"]

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.

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 manera de hacer cumplir eso id es un campo entero requerido, 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 anterior, podría tener una lista de publicaciones de blog de la siguiente manera:

{
    "posts": [
        {
            "id": 1001,
            "title": "What is JSON?",
            "author": {
                "id": 1,
                "name": "James Walker"
            }
        },
        {
            "id": 1002,
            "title": "What is SaaS?",
            "author": {
                "id": 1,
                "name": "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:

{
    "posts": [
        {
            "id": 1001,
            "title": "What is JSON?",
            "author": "{{ .authors.james }}"
        },
        {
            "id": 1002,
            "title": "What is SaaS?",
            "author": "{{ .authors.james }}"
        }
    ],
    "authors": {
        "james": {
            "id": 1,
            "name": "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 las marcas de tiempo como cadenas, como 2022-07-01T12:00:00+00:00pero 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.

Descubre más contenido

Subir Change privacy settings