JSON序列化
1.JSON.stringify()与JSON.parse()
在javascript中可以使用JSON.stringify()将一个对象转化为json字符串,相应的也可以使用JSON.parse()将一个json字符串转化为对象。
JSON.stringify(value, replacer, space])
参数说明:
-
value: 必需, 要转换的对象或数组
-
replacer: 可选,用于转换结果的函数或数组。如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:“”。如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。
-
space: 可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t。
JSON.parse(text, reviver)
参数说明:
- text:必需, 一个有效的 JSON 字符串。
- reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。
2. 特殊的转换规则
- 值为函数的属性,不会被转换
let obj = {
name: 'pp',
fun: function(){
return 3;
},
}
console.log(JSON.stringify(obj))
// 输出 {"name":"pp"}
- 值为undefined的属性,不会被转换
let obj = {
name: 'pp',
age: undefined
}
console.log(JSON.stringify(obj))
// 输出{"name":"pp"}
- 值为null的属性,会被转正常转换
let obj = {
name: 'pp',
age: null
}
console.log(JSON.stringify(obj))
// 输出{"name":"pp","age":null}
3.toJSON属性
若在对象中显式定义了toJSON属性,该属性的值为一个返回对象的函数,json序列化该对象,将得到序列化函数中返回对象的json字符串
let obj = {
name: 'pp',
toJSON: function(){
return {
address: "beijing"
}
}
}
console.log(JSON.stringify(obj))
// 输出{"address":"beijing"}
4.Json序列化类的实例
当我们序列化一个类的实例实,只会转化他的dataValues属性
class Cat {
constructor(name){
this.name = name
}
speak(){
console.log(`my name is ${this.name}`)
}
}
let kitty = new Cat('kitty')
console.log(JSON.stringify(kitty))
// 输出{"name":"kitty"}