JSON.stringify()
en JavaScript es una potente función para convertir objetos JavaScript en cadenas con formato JSON.
Sin embargo, viene con su conjunto de matices y trampas potenciales que los desarrolladores deben tener en cuenta para evitar comportamientos inesperados. En este artículo, exploraremos varias trampas asociadas con JSON.stringify()
.
Manejo de valores indefinidos, de función y de símbolo
Una limitación notable es que los valores undefined, Function y Symbol no son valores JSON válidos. Cuando se encuentran durante la conversión, se omiten (en objetos) o se cambian a null (en matrices).
Esto puede dar lugar a resultados inesperados, como que la función se sustituya por null.
Ejemplo:
const obj = { foo: function() {}, bar: undefined, baz: Symbol('example') };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // Output: '{"foo":null}'
const obj2 = {arr: [function(){}]};
console.log(JSON.stringify(obj2)); // Output: {"arr":[null]}
Valores primitivos para objetos booleanos, numéricos y de cadena
Los objetos booleanos, numéricos y de cadena se convierten a sus valores primitivos correspondientes durante la encadenación. Esto se ajusta a la semántica de conversión tradicional.
Ejemplo:
const boolObj = new Boolean(true);
const jsonString = JSON.stringify(boolObj);
console.log(jsonString); // Output: 'true'
Ignorar propiedades con clave de símbolo
Las propiedades con clave Symbol se ignoran completamente durante la stringificación, incluso cuando se utiliza una función de sustitución.
Esto significa que cualquier dato asociado a claves Symbol será excluido de la cadena JSON resultante.
Ejemplo:
const obj = { [Symbol('example')]: 'value' };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // Output: '{}'
const obj2 = {arr: [function(){}]};
console.log(JSON.stringify(obj2)); // Output '{}'
Manejo de valores infinitos, NaN y nulos
Los valores infinitos, NaN y nulos se consideran nulos durante la encadenación.
Ejemplo:
const obj = { value: Infinity, error: NaN, nothing: null };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // Output: '{"value":null,"error":null,"nothing":null}'
Responsabilidad del método toJSON()
Si un objeto tiene un método toJSON()
, es responsable de definir qué datos serán serializados. Esto permite una lógica de serialización personalizada para los objetos.
Ejemplo:
const obj = {
data: 'important information',
toJSON: function() {
return { customKey: this.data };
},
};
const jsonString = JSON.stringify(obj);
console.log(jsonString); // Output: '{"customKey":"important information"}'
Objetos Date tratados como cadenas
Las instancias de Date implementan la función toJSON()
devolviendo una cadena (igual que date.toISOString()
), lo que resulta en su tratamiento como cadenas durante la encadenación.
Ejemplo:
const dateObj = new Date();
const jsonString = JSON.stringify(dateObj);
console.log(jsonString); // Output: '"2023–12–06T12:34:56.789Z"'
Excepción de referencias circulares
Si JSON.stringify()
encuentra un objeto con referencias circulares, lanza un error. Las referencias circulares se producen cuando un objeto se referencia a sí mismo en un bucle.
Ejemplo:
const circularObj = { self: null };
circularObj.self = circularObj;
JSON.stringify(circularObj); // Throws an error
Serialización de propiedades enumerables
Para instancias de objetos como Map, Set, WeakMap y WeakSet, sólo se serializan sus propiedades enumerables. Las propiedades no enumerables quedan excluidas.
Ejemplo:
const mapObj = new Map([['key', 'value']]);
const jsonString = JSON.stringify(mapObj);
console.log(jsonString); // Output: '{}'
Error en la conversión de BigInt
Se produce un error al intentar convertir un valor de tipo BigInt utilizando JSON.stringify().
Ejemplo:
const bigIntValue = BigInt(42);
JSON.stringify(bigIntValue); // Throws an error
Conclusión
Comprender los matices de JSON.stringify()
es crucial para evitar problemas inesperados en tu código JavaScript. Al ser conscientes de estos escollos, los desarrolladores pueden utilizar esta función de forma más eficaz y evitar errores comunes en sus proyectos.