发布时间:2022-11-21 文章分类:WEB开发 投稿人:樱花 字号: 默认 | | 超大 打印

介绍

什么是序列化,序列化就是将对象数据转换为可以存储或者传输的过程。在js中,经常使用JSON来进行数据的序列化和反序列化,需要注意的是JavaScript不是JSON,JSON也不是JavaScript。

虽然JSON是基于JavaScript语法,但是JSON并不是Javascript的子集。JSON序列化是将对象或值转换为JSON字符串,并提供对应的解析JSON字符串的方法。

语法

JSON.stringify(value[, replacer [, space]])可将一个js对象或值转换为JSON字符串,其一共有三个参数,如果指定了replacer且为函数,则被序列化的每一个值都会经过此函数的处理;如果replacer为数组,则只有在数组中的属性才会被序列化。

value:将要被序列化的值,可为js对象或普通值

replacer:可选参数

space:可选参数

异常情况

案例

value

将对象或值转换为JSON字符串

// 基础值和对象
JSON.stringify({}) // '{}'
JSON.stringify('str') // '"str"'
JSON.stringify("str") // '"str"'
JSON.stringify(true) // 'true'
​
JSON.stringify([new Number(2), new String('true'), new Boolean(true)]) // 包装类型,转换为对应的基本类型。'[1, "true", true]'
JSON.stringify(undefined) // 单独转换,undefined
JSON.stringify(function () {}) // 单独转换,undefined
JSON.stringify([undefined, function () {}, Object, Symbol(1)]) // 如果出现在数组中,则转换为null,'[null, null,null, null]'
JSON.stringify({x:undefined, y:function () {}, Object, z:Symbol(1)}) // 如果出现在非数组对象中,则会被忽略,'{}'
​
// 以Symbol为键的属性都会被忽略
JSON.stringify({[Symbol('key')]: 'value'}) // '{}', 忽略Symbol
JSON.stringify({[Symbol('key')]: 'value'}, [Symbol('key')]) // '{}', 就算数组中包含也会忽略
JSON.stringify({[Symbol('key')]: 'value'}, function (k, v) {
if (k === 'symbol') {
return 'symbol'
}
}) // undefined, 就算是在replacer中强制指定,也会被忽略
​
JSON.stringify(NaN) // null
JSON.stringify(null) // null
JSON.stringify(Infinity) // null

replacer

replacer可以是一个函数,也可是一个数组。如果是函数,则有两个参数,分别为key和value,两者都可以被序列化;如果是数组,则仅在数组中的属性会被序列化。

function replacer (key, value) {
if (typeof value === 'boolean') {
return undefined;
} else if (typeof value === 'string') {
return {
flag: true
}
} else if (typeof value === 'number') {
return function () {
console.log('value', value)
}
} else if (Array.isArray(value)) {
return {
isArr: true
};
}
return value
}
let obj = {
bool: false,
str: 'hello',
num: 10,
arr: [20]
}
let jsonStr = JSON.stringify(obj, replacer); // '"str": {}, "arr": {}'
// 如果返回为undefined,则该属性不会显示在JSON字符串中
// 如果返回为对象,则该对象递归调用replacer序列化成JSON字符串
// 如果返回为函数,则该函数不会被序列化成JSON字符串
// 由于存在递归调用,因此需要避免超出最大调用栈
​
jsonStr = JSON.stringify(obj, ['bool', 'num']) // '{"bool": false, "num": 10}', 如果是数组,则仅会序列化数组中的属性

space

用来控制序列化后的JSON字符串里面空格的间距。如果是数字,则表示缩进多少个空格;如果是字符串,则用该字符串代替空格。space的最大长度为10

JSON.stringify({
x: 10,
y: 20
}, null, 4); // '{\n    "x": 10,\n    "y": 20\n}'
JSON.stringify({
x: 10,
y: 20
}, null, 'hello'); // '{\nhello"x": 10,\nhello"y": 20\n}'

toJSON

如果一个被序列化的对象拥有toJSON方法,则该方法就会覆盖默认的序列化行为,即不是该对象被序列化,而是调用toJSON方法后返回的值被序列化。

let obj = {
x: 10,
y: 30,
toJSON: function() {
return {z: 40};
}
};
JSON.stringify(obj); // '30',序列化的是toJSON返回的值,而不是整个对象
JSON.stringify({x: obj}, function(k, v) {
if (v.z == 40) {
return {z: 50}
}
return v;
}); // '{"x":{"z":50}}',使用replacer函数处理的也是处理的是toJSON返回的值,而不是整个对象

总结

以上就是JavaScript语法 JSON序列化之stringify实例详解的详细内容,更多关于JavaScript JSON 序列化 stringify的资料请关注本站其它相关文章!