话说JSON数据平常用的确实挺多的,但是基本上只知道怎么用,对其一些细节并没有整理过,今儿趁着下午有点空,坐下来,学习整理下,并分享出来。
对于JSON,首先它只是一种数据格式,并非一种语言,虽然和javascript长的比较像,但并不从属于javascript。如果你使用过其他编程语言,就会知道,其他语言也有针对JSON的解析器和序列化器。
JSON可以表示以下3中类型的值
- 简单值 如字符串、数值、布尔值和null,但不支持undefined
- 对象 对象作为一种复杂的数据类型,表示是一组无序的键值对儿,值可以是简单值也可以复杂的数据
- 数组 数组作为一种复杂的数据类型,表示是一组有序的列表儿,可以通过索引来获取引用的值,值可以是简单值,也可以复杂数据对象
1 . 简单值
简单值里没有什么可以重点讲的,主要强调一点,而且非常重要,那就是 JSON 字符串必须使用双引号,单引号会报错。
2. 对象
javascript 中的对象
var object = { name:"suyq", age :9 }
JSON 对象
{ "name":"suyq", "age" :9 }
与javascript对象相比,JSON对象有两个地方不一样
- 没有声明变量(JSON中没有变量的概念)
- 末尾没有分号
再说一遍 对象的属性必须加双引号,这个是必须的。
属性的值可以是简单类型,也可以是复杂类型的值。
{ "name":"suyq", "age" :9, "school":{ "name":"tjn", "location":"tj" } }
3.数组
javascript中的数组字面量
var v = [1,"hi",true];
JSON中的数组
[
{
"name": "张三",
"age": 18
},
{
"name": "李四",
"age": 22
},
{
"name": "王五",
"age": 20
}
]
JSON对象
json 对象主要有两个方法
JSON.stringify();
把javascript 对象转换为json对象
var book = { title:"javascript", authors:["li","susan"], year:2011,
edition:undefined
}; console.log(JSON.stringify(book));
输出结果:
{"title":"javascript","authors":["li","susan"],"year":2011}
默认情况下,javascript.stringify()所输出的json 字符串不包含任何空格字符和缩进。
值为undefined的任何属性会被跳过。
***选项
javascript.stringify() 函数还可以接收两个参数,第一个参数是个过滤器,可以是个数组,也可以是个函数,第二个是字符串中保留缩进。
1.过滤器
var book = { title:"javascript", authors:["li","susan"], year:2011, edition:undefined }; console.log(JSON.stringify(book,["title"]));
输出结果:{"title":"javascript"}
如果第二个参数是函数,传入的函数有两个参数,属性键名和键值。话不多说,直接上例子。
var book = { title:"javascript", authors:["li","susan"], year:2011, edition:undefined }; console.log(JSON.stringify(book,function(key,value){ switch (key) { case "authors": return value.join(","); case "edition": return undefined; default : return value; } }));
输出结果:{"title":"javascript","authors":"li,susan","year":2011}
2.字符串缩进
var book = { title:"javascript", authors:["li","susan"], year:2011, edition:undefined }; console.log(JSON.stringify(book,function(key,value){ switch (key) { case "authors": return value.join(","); case "edition": return undefined; default : return value; } },5));
输出结果:
{ "title": "javascript", "authors": "li,susan", "year": 2011 }
注意:最大缩进空格数为10 ,大于10 自动转换为10缩进。
2.toJSON 方法
var book = { title:"javascript", authors:["li","susan"], year:2011, edition:undefined, toJSON :function() { return this.title; } };
输出结果:"javascript"
有时候如果JSON.stringify()还无法满足序列化需求,可以通过对象上调用toJSON()方法,返回其自身的JSON数据格式。
toJSON()函数可以作为过滤器的补充。
把一个对象传入JSON.stringify(),序列化顺序如下
1.如果存在toJSON()方法,而且通过它可以取到有效值,则先调用它。否则,按照默认顺序执行序列化
2.如果提供第二个参数,执行该过滤器,传入过滤器的值是第一步的返回值
3.对第二步返回的值进行相应的序列化
4.如果提供了第三个参数,执行的相应的格式化
JSON.parse();
json.parse() 也可以接收另一个参数,该参数也是一个函数。
var book = { title:"javascript", authors:["li","susan"], year:2011, edition:undefined, releaseDate:new Date(2011,1,1) }; var jsonText = JSON.stringify(book); var bookcopy = JSON.parse(jsonText,function(key,value){ if(key=="releaseDate") { return new Date(); }else { return value; } }) console.log(bookcopy.releaseDate.getFullYear());
输出结果:2016