201 lines
5.9 KiB
Markdown
201 lines
5.9 KiB
Markdown
|
---
|
|||
|
title: JSON Stringify
|
|||
|
localeTitle: JSON Stringify
|
|||
|
---
|
|||
|
## JSON Stringify
|
|||
|
|
|||
|
`JSON.stringify()`方法将_JSON安全的_ JavaScript值转换为符合JSON的字符串。
|
|||
|
|
|||
|
有人可能会问JSON安全值是什么!让我们列出所有JSON不安全的值,列表中没有的任何内容都可以被认为是JSON安全的。
|
|||
|
|
|||
|
#### JSON不安全的值:
|
|||
|
|
|||
|
* `undefined`
|
|||
|
* `function(){}`
|
|||
|
* (ES6 +) `Symbol`
|
|||
|
* 带有圆形参考的对象
|
|||
|
|
|||
|
#### 句法
|
|||
|
|
|||
|
```javascript
|
|||
|
JSON.stringify( value [, replacer [, space]])
|
|||
|
```
|
|||
|
|
|||
|
以其最简单和最常用的形式:
|
|||
|
|
|||
|
```javascript
|
|||
|
JSON.stringify( value )
|
|||
|
```
|
|||
|
|
|||
|
#### 参数
|
|||
|
|
|||
|
`value` :要进行“字符串化”的JavaScript值。
|
|||
|
|
|||
|
`replacer` :(可选)一个函数或数组,用作要包含在JSON字符串中的值对象的属性的过滤器。
|
|||
|
|
|||
|
`space` :(可选)用于为JSON字符串提供缩进的数字或字符串值。如果提供了一个数值,那么许多空格(最多10个)在每个级别都充当了数字。如果提供了字符串值,则该字符串(最多10个字符)在每个级别充当缩进。
|
|||
|
|
|||
|
#### 返回类型
|
|||
|
|
|||
|
该方法的返回类型是: `string` 。
|
|||
|
|
|||
|
## 描述
|
|||
|
|
|||
|
JSON安全值将转换为其对应的JSON字符串形式。另一方面,JSON不安全值返回:
|
|||
|
|
|||
|
* 如果它们作为值传递给方法,则为`undefined`
|
|||
|
* 如果它们作为数组元素传递,则返回`null`
|
|||
|
* 如果作为对象的属性传递则没有
|
|||
|
* 如果它的对象上有一个循环引用,则抛出一个错误。
|
|||
|
|
|||
|
```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 );
|
|||
|
```
|
|||
|
|
|||
|
如果传递给它的对象在其上定义了`toJSON()`方法,则`JSON.stringify(...)`行为会有所不同。 `toJSON()`方法的返回值将被序列化而不是对象本身。
|
|||
|
|
|||
|
当对象包含任何非法JSON值时,这非常方便。
|
|||
|
|
|||
|
```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}"
|
|||
|
```
|
|||
|
|
|||
|
#### `replacer`
|
|||
|
|
|||
|
如前所述, `replacer`是一个过滤器,它指示哪些属性将包含在JSON字符串中。它可以是数组或函数。 在数组中,replacer包含仅包含在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
|
|||
|
```
|
|||
|
|
|||
|
如果`replacer`是一个函数,它将为对象本身调用一次,然后为对象中的每个属性调用一次,并且每次传递两个参数, _key_和_value_ 。要跳过序列化中的_键_ ,应返回`undefined` 。否则,应返回提供的_值_ 。如果这些_值_中的任何一个本身是对象,则`replacer`函数也会递归地序列化它们。
|
|||
|
|
|||
|
```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}'
|
|||
|
```
|
|||
|
|
|||
|
如果将数组传递给`JSON.stringify()`并且`replacer`为其任何元素返回`undefined` ,则该元素的值将替换为`null` 。 `replacer`函数无法从数组中删除值。
|
|||
|
|
|||
|
```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]"
|
|||
|
```
|
|||
|
|
|||
|
#### `space`
|
|||
|
|
|||
|
用于缩进的`space`参数使得`JSON.stringify()`的结果更漂亮。
|
|||
|
|
|||
|
```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
|
|||
|
// -----]
|
|||
|
// }"
|
|||
|
```
|
|||
|
|
|||
|
#### 更多信息:
|
|||
|
|
|||
|
请参阅[MDN文档](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) 。
|