201 lines
6.4 KiB
Markdown
201 lines
6.4 KiB
Markdown
![]() |
---
|
||
|
title: JSON Stringify
|
||
|
localeTitle: JSON Stringify
|
||
|
---
|
||
|
## JSON Stringify
|
||
|
|
||
|
El método `JSON.stringify()` convierte un valor de JavaScript _seguro_ para JSON en una cadena compatible con JSON.
|
||
|
|
||
|
¿Cuáles son los valores seguros de JSON que uno puede preguntar? Hagamos una lista de todos los valores inseguros de JSON y cualquier cosa que no esté en la lista puede considerarse segura para JSON.
|
||
|
|
||
|
#### Valores inseguros de JSON:
|
||
|
|
||
|
* `undefined`
|
||
|
* `function(){}`
|
||
|
* (ES6 +) `Symbol`
|
||
|
* Un objeto con referencia (s) circular (es) en él.
|
||
|
|
||
|
#### Sintaxis
|
||
|
|
||
|
```javascript
|
||
|
JSON.stringify( value [, replacer [, space]])
|
||
|
```
|
||
|
|
||
|
En su forma más simple y más utilizada:
|
||
|
|
||
|
```javascript
|
||
|
JSON.stringify( value )
|
||
|
```
|
||
|
|
||
|
#### Parámetros
|
||
|
|
||
|
`value` : el valor de JavaScript que se 'stringifica'.
|
||
|
|
||
|
`replacer` : (Opcional) Una función o una matriz que sirve como filtro para las propiedades del objeto de valor que se incluirán en la cadena JSON.
|
||
|
|
||
|
`space` : (Opcional) Un valor numérico o de cadena para proporcionar sangría a la cadena JSON. Si se proporciona un valor numérico, muchos espacios (hasta 10) actúan como indentables en cada nivel. Si se proporciona un valor de cadena, esa cadena (hasta los primeros 10 caracteres) actúa como sangría en cada nivel.
|
||
|
|
||
|
#### Tipo de retorno
|
||
|
|
||
|
El tipo de retorno del método es: `string` .
|
||
|
|
||
|
## Descripción
|
||
|
|
||
|
Los valores seguros de JSON se convierten a su forma de cadena JSON correspondiente. Los valores inseguros de JSON por otro lado devuelven:
|
||
|
|
||
|
* `undefined` si se pasan como valores al método
|
||
|
* `null` si se pasan como un elemento de matriz
|
||
|
* nada si se pasa como propiedades en un objeto
|
||
|
* arroja un error si se trata de un objeto con referencias circulares.
|
||
|
|
||
|
```javascript
|
||
|
//JSON-safe values
|
||
|
JSON.stringify({}); // '{}'
|
||
|
JSON.stringify(true); // 'true'
|
||
|
JSON.stringify('foo'); // '"foo"'
|
||
|
JSON.stringify([1, 'false', false]); // '[1,"false",false]'
|
||
|
JSON.stringify({ x: 5 }); // '{"x":5}'
|
||
|
JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)) // '"2006-01-02T15:04:05.000Z"'
|
||
|
|
||
|
//JSON-unsafe values passed as values to the method
|
||
|
JSON.stringify( undefined ); // undefined
|
||
|
JSON.stringify( function(){} ); // undefined
|
||
|
|
||
|
//JSON-unsafe values passed as array elements
|
||
|
JSON.stringify({ x: [10, undefined, function(){}, Symbol('')] }); // '{"x":[10,null,null,null]}'
|
||
|
|
||
|
//JSON-unsafe values passed as properties on a object
|
||
|
JSON.stringify({ x: undefined, y: Object, z: Symbol('') }); // '{}'
|
||
|
|
||
|
//JSON-unsafe object with circular reference on it
|
||
|
var o = { },
|
||
|
a = {
|
||
|
b: 42,
|
||
|
c: o,
|
||
|
d: function(){}
|
||
|
};
|
||
|
|
||
|
// create a circular reference inside `a`
|
||
|
oe = a;
|
||
|
|
||
|
// would throw an error on the circular reference
|
||
|
// JSON.stringify( a );
|
||
|
```
|
||
|
|
||
|
`JSON.stringify(...)` comporta de manera diferente si un objeto que se le pasa tiene un `toJSON()` definido. El valor de retorno del `toJSON()` se serializará en lugar del objeto en sí.
|
||
|
|
||
|
Esto es excepcionalmente útil cuando un objeto contiene cualquier valor JSON ilegal.
|
||
|
|
||
|
```javascript
|
||
|
//JSON-unsafe values passed as properties on a object
|
||
|
var obj = { x: undefined, y: Object, z: Symbol('') };
|
||
|
|
||
|
//JSON.stringify(obj); logs '{}'
|
||
|
obj.toJSON = function(){
|
||
|
return {
|
||
|
x:"undefined",
|
||
|
y: "Function",
|
||
|
z:"Symbol"
|
||
|
}
|
||
|
}
|
||
|
JSON.stringify(obj); //"{"x":"undefined","y":"Function","z":"Symbol"}"
|
||
|
|
||
|
//JSON-unsafe object with circular reference on it
|
||
|
var o = { },
|
||
|
a = {
|
||
|
b: 42,
|
||
|
c: o,
|
||
|
d: function(){}
|
||
|
};
|
||
|
|
||
|
// create a circular reference inside `a`
|
||
|
oe = a;
|
||
|
|
||
|
// would throw an error on the circular reference
|
||
|
// JSON.stringify( a );
|
||
|
|
||
|
// define a custom JSON value serialization
|
||
|
a.toJSON = function() {
|
||
|
// only include the `b` property for serialization
|
||
|
return { b: this.b };
|
||
|
};
|
||
|
|
||
|
JSON.stringify( a ); // "{"b":42}"
|
||
|
```
|
||
|
|
||
|
#### El `replacer`
|
||
|
|
||
|
El `replacer` , como se mencionó anteriormente, es un filtro que indica qué propiedades deben incluirse en la cadena JSON. Puede ser una matriz o una función. Cuando es una matriz, el sustituto contiene las representaciones de cadena de solo aquellas propiedades que se incluirán en la cadena JSON.
|
||
|
|
||
|
```javascript
|
||
|
var foo = {foundation: 'Mozilla', model: 'box', week: 45, transport: 'car', month: 7};
|
||
|
JSON.stringify(foo, ['week', 'month']); // '{"week":45,"month":7}', only keep "week" and "month" properties
|
||
|
```
|
||
|
|
||
|
Si el `replacer` es una función, se llamará una vez para el objeto en sí, y luego una vez para cada propiedad en el objeto, y cada vez se pasan dos argumentos, _clave_ y _valor_ . Para omitir una _clave_ en la serialización, se debe devolver `undefined` . De lo contrario, el _valor_ proporcionado debe ser devuelto. Si alguno de estos _valores_ son objetos en sí mismos, la función de `replacer` serializa también recursivamente.
|
||
|
|
||
|
```javascript
|
||
|
function replacer(key, value) {
|
||
|
// Filtering out properties
|
||
|
if (typeof value === 'string') {
|
||
|
return undefined;
|
||
|
}
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
var foo = {foundation: 'Mozilla', model: 'box', week: 45, transport: 'car', month: 7};
|
||
|
JSON.stringify(foo, replacer); // '{"week":45,"month":7}'
|
||
|
```
|
||
|
|
||
|
Si se pasa una matriz a `JSON.stringify()` y el `replacer` devuelve `undefined` para cualquiera de sus elementos, el valor del elemento se reemplaza por `null` . `replacer` funciones de `replacer` no pueden eliminar valores de una matriz.
|
||
|
|
||
|
```javascript
|
||
|
function replacer(key, value) {
|
||
|
// Filtering out properties
|
||
|
if (typeof value === 'string') {
|
||
|
return undefined;
|
||
|
}
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
var foo = ['Mozilla', 'box', 45, 'car', 7];
|
||
|
JSON.stringify(foo, replacer); // "[null,null,45,null,7]"
|
||
|
```
|
||
|
|
||
|
#### El `space`
|
||
|
|
||
|
El parámetro de `space` utilizado para la sangría hace que el resultado de `JSON.stringify()` más bonito.
|
||
|
|
||
|
```javascript
|
||
|
var a = {
|
||
|
b: 42,
|
||
|
c: "42",
|
||
|
d: [1,2,3]
|
||
|
};
|
||
|
|
||
|
JSON.stringify( a, null, 3 );
|
||
|
// "{
|
||
|
// "b": 42,
|
||
|
// "c": "42",
|
||
|
// "d": [
|
||
|
// 1,
|
||
|
// 2,
|
||
|
// 3
|
||
|
// ]
|
||
|
// }"
|
||
|
|
||
|
JSON.stringify( a, null, "-----" );
|
||
|
// "{
|
||
|
// -----"b": 42,
|
||
|
// -----"c": "42",
|
||
|
// -----"d": [
|
||
|
// ----------1,
|
||
|
// ----------2,
|
||
|
// ----------3
|
||
|
// -----]
|
||
|
// }"
|
||
|
```
|
||
|
|
||
|
#### Más información:
|
||
|
|
||
|
Consulte la [documentación de MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) .
|