Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

JSON no contiene diccionarios ni listas nativos. Es un formato de texto. Lo que sí contiene son objetos JSON (pares nombre/valor entre llaves) y arreglos JSON (valores ordenados entre corchetes). Esas estructuras solo se convierten en objetos, arrays, diccionarios o listas del lenguaje cuando un programa analiza el texto. En JavaScript, por ejemplo, JSON.parse produce objetos y arrays nativos cuando la raíz del documento es un objeto o un arreglo.

Dos capas que conviene separar

Casi todas las confusiones sobre JSON nacen de mezclar dos capas distintas:

  • La capa de texto. Es una cadena de caracteres que viaja por una red, se guarda en un archivo o se devuelve desde una API. Puede copiarse, enviarse y leerse con cualquier editor.
  • La capa de valor. Es la estructura que el lenguaje mantiene en memoria después de analizar ese texto. Aquí se accede a propiedades, se recorren listas y se modifican datos.

Un JSON de ejemplo es este texto:

{"usuario":{"nombre":"Ana","activo":true},"etiquetas":["nuevo","json"]}

Como texto, tiene un objeto raíz. Dentro hay un objeto anidado (usuario) y un arreglo (etiquetas). Mientras no se analice, el programa solo ve caracteres: no puede pedir usuario.nombre porque todavía no existe ningún objeto.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Cómo pasar del texto al valor y de vuelta

En JavaScript, las dos operaciones fundamentales son la pareja de funciones del objeto global JSON, documentadas en MDN Web Docs:

JSON.parse: de texto a valor

const texto = '{"usuario":{"nombre":"Ana","activo":true},"etiquetas":["nuevo","json"]}';
const valor = JSON.parse(texto);

valor.usuario.nombre;   // "Ana"
valor.etiquetas[1];     // "json"
typeof valor;           // "object"

Tras el análisis, valor es un objeto nativo de JavaScript. Sus claves se leen como propiedades y los elementos de etiquetas se leen por índice, como en cualquier array.

JSON también admite una raíz que sea un arreglo o un valor primitivo. Por eso JSON.parse('[1,2,3]') devuelve un array, y JSON.parse('"hola"') devuelve una cadena. No todo texto JSON produce un objeto.

JSON.stringify: de valor a texto

const texto2 = JSON.stringify(valor);
// '{"usuario":{"nombre":"Ana","activo":true},"etiquetas":["nuevo","json"]}'

La serialización recorre el valor y produce texto JSON. Como veremos más abajo, no todo lo que existe en JavaScript tiene representación en JSON, y ahí es donde aparecen las pérdidas.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Qué tipos caben en JSON

La gramática de JSON reconoce un conjunto cerrado de valores. La tabla compara cada uno con el resultado que obtiene un programa JavaScript tras JSON.parse.

Valor en el texto JSON Ejemplo en el texto Valor en JavaScript tras parsear
Cadena "Ana" String
Número 42, 3.5 Number
Booleano true, false Boolean
Nulo null null
Objeto {"clave":1} Objeto simple (equivalente a diccionario)
Arreglo [1,2] Array (equivalente a lista)

JSON no tiene sintaxis propia para funciones, undefined, NaN, Infinity, Date, Map ni Set. Cualquier dato de esos tipos debe transformarse antes de escribirse como JSON.

Qué se pierde al serializar

Cuando JSON.stringify encuentra un valor que no encaja en la gramática, aplica reglas fijas. Estas reglas se ejecutan en el momento de serializar, no al leer el texto después.

Valor de origen (JavaScript) Dentro de un objeto Dentro de un array
undefined, función o símbolo La propiedad se omite El elemento se convierte en null
NaN o Infinity null null
Map o Set {}, sin sus entradas {}, sin sus entradas
Date Cadena ISO 8601 (a través de toJSON) Cadena ISO 8601 (a través de toJSON)
Referencia circular Lanza TypeError; no se serializa
BigInt Lanza TypeError sin una conversión explícita previa

Dos detalles pesan más de lo que parecen. El primero es que undefined y null no son intercambiables: una propiedad ausente y una propiedad con valor null llegan a un receptor de formas distintas. El segundo es que Map y Set no fallan en voz alta: se convierten en {} y el dato desaparece en silencio.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Errores comunes al tratar JSON como si fuera un objeto

  • Confundir el literal de JavaScript con JSON. JSON exige comillas dobles en claves y cadenas, no admite comentarios y no permite comas finales. Un literal como {clave: 'valor',} es válido en JavaScript, pero no es JSON.
  • Esperar que JSON.parse(JSON.stringify(valor)) sea una copia fiel. Esa combinación elimina los tipos no representables. Un Date vuelve como cadena, un Map desaparece y las referencias circulares fallan. No es un clonado profundo completo.
  • Asumir que JSON recuerda clases. JSON no incluye etiquetas de tipo. Si la aplicación necesita recuperar una fecha o una clase, debe definir una convención explícita.
  • Esperar precisión exacta en números grandes. JavaScript representa los números con doble precisión de punto flotante; los enteros fuera del rango seguro (hasta 253 − 1) pueden perder exactitud. Para identificadores largos o importes exactos, suele usarse una cadena.

Cómo representar tipos que JSON no tiene

JSON se puede extender sin cambiar su gramática mediante dos mecanismos de la función JSON.parse y JSON.stringify: un reviver transforma valores al analizar, y un replacer transforma valores al serializar.

// Serializar: convertir un Map en una lista de pares
const datos = { roles: new Map([["admin", 1], ["lector", 2]]) };
const json = JSON.stringify(datos, (clave, valor) =>
  valor instanceof Map ? { __tipo: "Map", entradas: [...valor] } : valor
);

// Analizar: reconstruir el Map a partir de esa convención
const recuperado = JSON.parse(json, (clave, valor) =>
  valor && valor.__tipo === "Map" ? new Map(valor.entradas) : valor
);

La convención (__tipo, entradas) la define la aplicación. Otro programa que lea el mismo JSON no sabrá qué significa a menos que conozca esa regla. Por eso la convención debe documentarse junto con el esquema.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Cuándo JSON es la opción adecuada

JSON es ideal para intercambiar datos entre sistemas que no comparten lenguaje. Otras alternativas resuelven problemas distintos y conviene compararlas por los mismos ejes.

Criterio JSON JSON con convención propia Formatos con tipos explícitos (por ejemplo, binarios o esquemas tipados)
Preservación de tipos (fechas, clases, mapas) Limitada a cadenas, números, booleanos, null, objetos y arrays Se amplía con reglas que define la aplicación Depende del formato; suele incluir tipos más ricos
Interoperabilidad entre lenguajes Alta: casi todos los lenguajes lo leen Media: el receptor debe conocer la convención Variable: depende del soporte del formato
Legibilidad humana Alta Alta, aunque las convenciones añaden ruido Variable
Validación y contrato Requiere un esquema aparte Requiere documentar la convención y el esquema Puede incluir validación integrada según el formato
Precisión numérica Depende del lenguaje receptor Igual que JSON; se resuelve con cadenas si hace falta Depende del formato

Como regla práctica, usa JSON para estructuras portables y comunes. Si necesitas que un tipo complejo sobreviva el viaje completo, decide antes si la convención propia es suficiente o si conviene un formato que lo modele de manera explícita.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Lista de comprobación antes de serializar

  • ¿El valor raíz es un objeto, un arreglo o un primitivo? Confirma que el receptor espera ese tipo.
  • ¿Hay undefined, funciones o símbolos en propiedades? Decide si se omiten o si deben sustituirse por null.
  • ¿Hay Map, Set, Date, clases o BigInt? Conviértelos explícitamente con un replacer.
  • ¿Hay referencias circulares? Rómpelas antes de serializar; JSON.stringify no las resuelve.
  • ¿Hay enteros grandes o importes exactos? Considera representarlos como cadenas.
  • ¿El esquema está documentado? Un JSON válido no garantiza que los datos sean los que el receptor espera.

Compatibilidad y versiones

La semántica de JSON.parse y JSON.stringify es estable en los entornos JavaScript modernos. Las funciones auxiliares como toJSON o los replacers con funciones tienen el mismo comportamiento en navegadores y en Node.js actuales, pero los detalles de implementación pueden variar entre entornos antiguos. Antes de depender de un comportamiento concreto en un runtime específico, compruébalo en la documentación de MDN Web Docs para ese entorno.

Las reglas descritas en este artículo corresponden al estado de la documentación consultada en octubre de 2026.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.