JSON.stringify 字符串化的一些表现

JSON.stringify

所有安全的 JSON 值(JSON-safe)都可以使用 JSON.stringify(..) 字符串化,例如:

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

像 undefined、function、symbol
(ES6+)和包含循环引用(对象之间相互引用,形成一个无限循环)的对象都不符合 JSON 结构标准,属于不安全的 JSON 值

JSON.stringify(..) 在对象中遇到 undefined、function 和 symbol 时会自动将其忽略,在数组中则会返回 null(以保证单元位置不变)

JSON.stringify(undefined) // undefined
JSON.stringify(function () {}) // undefined
JSON.stringify(
 [1, undefined, function () {}, 4]
) // "[1,null,null,4]"
JSON.stringify(
 { a : 2, b : function () {} }
) // "{"a":2}"

对包含循环引用的对象执行 JSON.stringify(..) 会出错

JSON.stringify 参数

可以向 JSON.stringify(..) 传递一个可选参数 replacer,它可以是数组或者函数

replacer 是一个数组的时候,它必须是一个字符串数组,其中包含序列化要处理的对象的属性名称,除此之外其他的属性则被忽略

var a = {
 b: 42,
 c: "42",
 d: [1,2,3]
}
JSON.stringify(a, ["b","c"]) // "{"b":42,"c":"42"}"

replacer 是一个函数的时候,如果要忽略某个键就返回 undefined,否则返回指定的值

var a = {
 b: 42,
 c: "42",
 d: [ 1, 2, 3 ]
}
JSON.stringify(a, function (k, v) {
 if (k !== "c") return v
})
// "{"b":42,"d":[1,2,3]}"

JSON.string 还有一个可选参数 space,用来指定输出的缩进格式

space 为正整数时是指定每一级缩进的字符数

var a = {
 b: 42,
 c: "42",
 d: [ 1, 2, 3 ]
}
JSON.stringify(a, null, 4)
/*
"{
    "b": 42,
    "c": "42",
    "d": [
        1,
        2,
        3
    ]
}"
*/

space 还可以是字符串,此时缩进会用指定的字符串替代

var a = {
 b: 42,
 c: "42",
 d: [ 1, 2, 3 ]
}
JSON.stringify( a, null, "--" )
/*
"{
--"b": 42,
--"c": "42",
--"d": [
----1,
----2,
----3
--]
}"
*/

toJSON

如果对象中定义了 toJSON 方法,JSON 字符串化时会首先调用该方法,然后用它的返回值来进行序列化

var o = {}
var a = {
 b: 42,
 c: o,
 d: function () {}
}
// 在 a 中创建一个循环引用
o.e = a
// 循环引用在这里会产生错误
JSON.stringify(a)
// 自定义的 JSON 序列化
a.toJSON = function () {
 // 序列化仅包含 b
 return { b: this.b }
}
JSON.stringify(a) // "{"b":42}"
除特殊说明外本人博客均属原创,转载请注明出处:http://blog.johnhan.cn/blog_1077.html
京ICP备19044523号-1