JSON.stringify()

916 阅读2分钟

写在前边

不言而喻,JSON.stringify() 是用来将合法的JSON数据字符串化的!然而在正常的工作中我们用到的只是最基础的功能;今天我们就探索不一样的JSON.stringify()

基础用法

基本数据类型

JSON.stringify(2) // "2"
JSON.stringify("2") // ""2"" (含有双引号的字符串)
JSON.stringify(null) // "null"
JSON.stringify(true) // "true"

所有安全的JSON值(JSON-safe)都可以使用JSON.stringify()字符串化。安全的JSON值是指能够呈现为有效JSON格式的值。

引用数据类型

对于引用数据类型来说,通常情况下和基本数据类型一样。但是引用数据类型中定义了toJSON()方法,JSON字符串化的时候就优先调用该方法,用它的返回值来进行序列化。

var a = [ 1 ];
a.toJSON = function () {
    return 'a'
}
JSON.stringify(a) // ""a""(含有双引号的字符串)

tips: toJSON()应该返回是一个能够被字符串化的安全的JSON值,而不是返回一个JSON字符串

不同寻常的 JSON.stringify()

JSON.stringify.length // 3

通过上述代码可以知道,JSON.stringify()函数有 3个 参数,通常大家用到的只是第一个,下边我们就依次来介绍下后边两个参数。

参数二(replacer)

replacer可以是数组或者函数,用来指定对象序列化过程中哪些属性应该被处理,和toJSON()很像。

数组

replacer是一个数组的情况下,那么它必须是一个字符串数组(数组中的非字符串值会被忽略)。

var a = { b: 2, c: '2', d: [1, 2, 3] }

JSON.stringify(a, ['b', 'c']) // "{"b":2,"c":"2"}"
// 数组中包含非字符串值
JSON.stringify(a, ['b', 2]) // "{"b":2}"

函数

如果 replacer 是一个函数,这个函数会有两个参数(key, value);该函数会对对象本身调用一次,然后对对象中每个属性各调用一次(深度遍历调用),如果要忽略某个属性就返回undefined,否则返回指定的值。

var a = { b: 2, c: '2', d: [1, 2, 3] }
JSON.stringify(a, function (key, value) {
    console.log('replacer')
    if (key !== 'c') return value
})
// 输出7次replacer
// "{"b":2,"d":[1,2,3]}"

参数三(space)

space 用来指定输出的缩进格式。space为整数N时,则每一级会比上一级缩进N个空格;space为字符串S时,则每一级会比上一级缩进S

tips: N最大为10;S长度超过10位的话会取前十个字符

var a = { b: 2, c: '2', d: [1, 2, 3] }

JSON.stringify(a, null, 4)

// "{
//     "b": 2,
//     "c": "2",
//     "d": [
//         1,
//         2,
//         3
//     ]
// }"

JSON.stringify(a, null, '----')

// "{
// ----"b": 2,
// ----"c": "2",
// ----"d": [
// --------1,
// --------2,
// --------3
// ----]
// }"

参考