1. 概念
JSON是JavaScript的一个严格子集,利用了JavaScript中的一些模式来表示结构化数据。与JavaScript对象字面量相比,JSON对象有三个地方不一样,首先,没有声明变量,其次末尾没有分号,第三,JSON对象的属性必须加双引号。
2. JSON字符串化 -JSON.stringify
所有安全的JSON值都可以使用JSON.stringify字符串化,所谓安全的JSON值是不包含 undefined function symbol 及循环引用的对象。
JSON.stringify在对象中遇到undefined function 和symbol时会自动将其忽略,在数组中则会返回null(以保证单元位置不变),对包含循环应用的对象执行JSON.stringify会出错。
如果对象定义了toJSON方法,JSON字符串化时会首先调用该方法,然后用它的返回值进行序列化,如果要对含有非法JSON值的对象序列化或者对象中的某些值无法被序列化时,就需要定义toJSON方法来返回一个安全的JSON值
**
2.1 语法
JSON.stringify(object,replacer,space)
1.replacer:它可以是一个数组或函数,用来指定对象序列化过程中哪些属性应该被处理。如果replacer是一个数组,包含要序列化处理的对象属性名,其他的属性会被忽略,如果replacer是一个函数,它会对对象本身调用一次,然后对对象中的每个属性各调用一次。
var a = {
"b" : 42,
"c" : 42,
"d" : [1,2,3]
}
JSON.stringify(a,["b,""c"]) //"{"b":42,"c":"42"}"
JSON.stringify(a,function(k,v) {
if(k !== "c") {
return v
}
}) //"{"b":42,"d":[1,2,3]}"
2.space:用来指定输出的缩进格式,space是正整数时指定每一级缩进的字符数,它还可以是字符串,表示缩进用指定的字符串,而非空格
2.2 序列化规则顺序
- 如果被序列化的对象存在toJSON方法并且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
- 如果提供了第二个参数,应用这个数组或函数过滤器,传入函数过滤器的值是第1步返回的值。
- 对第二部返回的每个值进行响应的序列化。
- 如果提供了第三个参数,执行响应的格式化。
3. 反序列化 - JSON.parse()
JSON.parse(json,reviver)
reviver:还原函数,接受两个参数,一个键一个值,如果还原函数返回undefined,则表示从结果中删除响应的键值对,如果返回其他值,则将该值插入到结果中,在将日期字符串转换为Date对象时,经常要用到还原函数。如下:
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C.Zakas"
],
edition: 3,
year: 2011,
releaseDate: new Date(2011,11,1)
}
var jsonText = JSON.stringify(book)
var bookCopy = JSON.parse(jsonText,function(key, value) {
if(key === 'releaseDate'){
return new Date(value)
}else{
return value
}
})