El conocimiento es el nuevo dinero.
Aprender es la nueva manera en la que inviertes
Acceso Cursos

JSON.stringify() - Javascript

Matices de la encadenación de objetos JSON en JS te comparto algunas de sus trampas 🤫

· 4 min de lectura
JSON.stringify() - Javascript

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.

CPU
1 vCPU
MEMORIA
1 GB
ALMACENAMIENTO
10 GB
TRANSFERENCIA
1 TB
PRECIO
$ 4 mes
Para obtener el servidor GRATIS debes de escribir el cupon "LEIFER"

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.

Fuente