看了js高级程序设计这本书关于json的讲解,下面我把里面我认为比较重要的知识提炼出来,一方面给帮助自己理解,同时也分享给有需要的朋友
json:是一种数据格式,不是一种编程语言
json的语法可以表示简单值(字符串、数值、布尔值、null)和复杂值(对象和数组)。需要注意的是,json中不支持undefined
json不支持变量、函数、对象实例,它就是一种表示结构化数据的格式
在实际的应用中,json更多的用来保存更复杂的数据结构,而简单值只是整个数据结构中的一部分。
json中的对象与JavaScript字面量的对比
JavaScript对象字面量的写法:
var person = {
name:"leo",
age:25
};
json对象的写法
{
"name":"leo",
"age":25
}
与JavaScript的对象字面量相比,json对象有两个地方不一样
1、json没有声明变量(json中没有变量的概念)
2、json没有末尾的分号(因为它不是JavaScript语句,所以不需要分号);
还有我们看到JavaScript字面量中的对象的属性可以不加双引号,但json对象的属性必须加双引号
json对象有两个方法:stringify()和parse()。在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为json字符串和把json字符串解析为原生JavaScript值,看个例子
<script>
var book = {
title:"javascript",
author:[
"leo"
],
edi:3,
year:2018
};
var jsonT = JSON.stringify(book);
console.dir(jsonT);
console.dir(typeof(jsonT));//string
</script>
打印的结果为{"title":"javascript","author":["leo"],"edi":3,"year":2018},并且格式为string
这个例子使用json.stringify()把一个JavaScript对象序列化为一个json字符串,然后将它保存在jsonT中,默认情况下,输出的字符串不包括任何空格字符或缩进,注意:在序列化JavaScript对象时,所有函数及原型成员都会被忽略,不体现在结果中,值为undefined的任何属性也都会被跳过。结果中最终都是值为有效的json数据类型的实例属性
将json字符串直接传递个json.parse(),就可以得到相应的JavaScript值。例
var book2 = JSON.parse(jsonT);
console.dir(book2);
console.dir(Object.prototype.toString.call(book2));//[object Object]
虽然book 和book2具有相同的属性,但他们是两个独立的、没有任何关系的对象
序列化选项:
JSON.stringify(),除了要序列的JavaScript对象外,还可以接收两个参数,第一个参数是过滤器,可以是一个数组也可以是一个函数;第二个参数是一个选项,表示是否在json字符串中保留缩进。为了改变序列化对象的结果,函数返回值就是相应键的值。不过要注意,如果函数返回了undefined,那么相应的属性会被忽略。
例1:
<script>
var book = {
title:"javascript",
author:[
"leo"
],
edi:3,
year:2018,
hanshu:function(){},
weidingyi:undefined
};
var jsonT = JSON.stringify(book,["title","edi"]);
console.dir(jsonT);//{"title":"javascript","edi":3}
</script>
从打印结果可知,当过滤器参数是数组时,那么JSON.stringify()的结果中将只包含数组中列出的属性
例2: var book = {
title:"javascript",
author:[
"leo","momo","peng"
],
edi:3,
year:2018,
hanshu:function(){},
weidingyi:undefined
};
var jsonT = JSON.stringify(book,function(key,value){
switch(key){
case "author":
return value.join(",");
case "edi":
return undefined;
case "year":
return 5000;
default:
return value;
}
});
console.dir(jsonT);//{"title":"javascript","author":"leo,momo,peng","year":5000}
如果第二个参数是函数,传入函数接收两个参数,属性名和属性值。根据属性名可以知道应该如何处理要序列化对象中的属性。属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串。注意,如果返回的了undefined,那么相应的属性会被忽略。
一定要提供default项,此时返回传入的值,以便其他值都能正常出现在结果中
JSON.stringify()第三个参数用于控制结果中的缩进和空白符,如果这个参数是个数值,那他表示是每个级别缩进的空格数。例如要在每个级别缩进四个空格,代码是这样的
<script>
var book = {
title:"javascript",
author:[
"leo","momo","peng"
],
edi:3,
year:2018,
hanshu:function(){},
weidingyi:undefined
};
var jsonT = JSON.stringify(book,null,4);
console.dir(jsonT);/*
{
"title": "javascript",
"author": [
"leo",
"momo",
"peng"
],
"edi": 3,
"year": 2018
}*/
</script>
从打印的结果可以看出,结果字符串中插入了换行符以提高可读性。只要传入有效的控制缩进的参数值,结果字符串就会包含换行符,最大缩进空格数为10,超过10的值都会自动转换为10.
如果缩进参数是一个字符串而非数值,则这个字符串将在json字符串中被用作缩进字符(不再使用空格),同样缩进字符串的长度不能超过10个字符长,超过只出现前10个字符。
解析选项
JSON.parse()也可以接收另一个参数,该参数是一个函数,将在每个键值对儿上调用,这个函数叫还原函数,和JSON.stringify()接收的过滤函数一样,都接收两个参数,一个键和一个值,并且都需要返回一个值
如果还原函数返回,undefined则表示要从结果中删除相应的键;如果返回其他值,则将改值插入结果中。