Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →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.
Recommended Free Tools
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:
#1 Best Overall
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.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Qué 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.
Rank #3
| 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.
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. UnDatevuelve como cadena, unMapdesaparece 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.
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.
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 pornull. - ¿Hay
Map,Set,Date, clases oBigInt? Conviértelos explícitamente con un replacer. - ¿Hay referencias circulares? Rómpelas antes de serializar;
JSON.stringifyno 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.
Quick Recap
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.

