关于JSON,是一种数据格式,不是一种编程语言;
JSON并不从属于JavaScript,并不是只有javaScript才能使用JSON,JSON只是一种数据格式;
1.语法
JSON的语法可以表示三种类型的值:
- 简单值:可以在JSON中表示字符串、数组、布尔值、和null;但不支持undefined;
- 对象:对象作为一种复杂数据类型,表示的是一种无序的键值对;每个键值对中的值可以是简单值,也可以是复杂数据类型;
- 数组:表示一组有序的值的列表,可以通过数值索引来访问其中的值;数组中的值可以是简单值,也可以是复杂数据类型;
1.1 简单值
表示数值:5
表示字符串:Hello world!
在实际应用中,JSON更多地用来表示更复杂的数据结构,而简单值只是整个数据结构中的一部分;
1.2 对象
与JavaScript相比,JSON对象的区别:
- JSON对象没有声明变量,JSON中没有声明变量的概念;
- 没有末尾的分号,因为这不是JavaScript的语句,所以不需要分号;
- JSON对象的属性必须假双引号,这在JSON中是必须的;
JavaScript中的对象例子:
var object={
name:"Tom", //JS中的对象属性名,可以添加双引号,也可以不添加
age:29
};
JSON对象:(JSON中的对象属性名,必须添加双引号)
{
"name": "Tom",
"age": 29
}
1.3 数组
JSON数组采用的就是JS中的数组字面量的形式。
JS中的数组: JSON数组也没有变量和分号;
var values=[25, "hi", true];
JSON数组:
{25, "hi", true}
把数组和对象结合起来,可以构成更复杂的数据集合;
2.解析JSON
JSON数据的流行原因,一个是因为与JavaScript类似的语法;再一个原因是,JSON数据结构可以解析成有用的JavaScript对象;而XML数据要解析成DOM并且从中提取数据,极为麻烦;
2.1解析JSON对象
不推荐造势的eval()函数,因为可能会执行一些恶意代码;
JSON对象有两个方法:stringify()和parse(), 分别把JS对象序列化为JSON字符串和把JSON字符串解析为原生JS值;
var book={
title:"js高级教程",
author:[ "Nicholas C. Zakas"],
edition:3,
year:2011
}
var jsonText=JSON.stringify(book);
console.log(jsonText);
转换结果:
{"title":"js高级教程","author":["Nicholas C. Zakas"],"edition":3,"year":2011}
**注意:**所有的函数及原型成员都会被有意忽略,不体现在结果中;值为undefined的任何属性,也都会被跳过。最终都是值为有效JSON数据类型的实例属性;
使用parse转成JS值:
var book={
title:"js高级教程",
author:[ "Nicholas C. Zakas"],
edition:3,
year:2011
}
var jsonText=JSON.stringify(book);
console.log(jsonText);
var bookCopy=JSON.parse(jsonText);
console.log(bookCopy);
//控制台结果
Object
author: ["Nicholas C. Zakas"]
edition: 3
title: "js高级教程"
year: 2011
__proto__: Object
虽然book和bookCopy具有相同的属性,但他们是两个没有任何关系的对象;
如果传入给JSON.parse()的字符串不是有效的JSON,则会抛出错误;
2.2序列化选项
JSON.stringify()可以接受另外两个参数,第一个参数是过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进;
2.2.1 过滤结果
如果过滤器 参数是数组,那么JSON.stringify()的结果只包含数组中列举的属性;
var book = {
title: "js高级教程",
author: ["Nicholas C. Zakas"],
edition: 3,
year: 2011
}
var jsonText = JSON.stringify(book,["title","edition"]);
console.log(jsonText);
// {"title":"js高级教程","edition":3}
如果过滤器的参数是函数,,则传入的函数接受两个参数,属性名和属性值;
函数的返回值就是相应的值; 如果函数返回了undefined,那么对应的属性就会被忽略;
var book = {
title: "js高级教程",
author: ["Nicholas C. Zakas"],
edition: 3,
year: 2011
}
var jsonText = JSON.stringify(book,function(key,value){
switch(key){
case"authors":
return value.join(",");
case"year":
return 5000;
case"edition":
return undefined;
default:
return value;
}
});
console.log(jsonText);
// {"title":"js高级教程","author":["Nicholas C. Zakas"],"year":5000}
2.2.2 字符串缩进
JSON.stringify()方法的第三个参数用于控制结果中的缩进和空白符。如果传入一个数值,那么他表示的是每个级别缩进的空格数;只要传入有效的控制缩进的参数值,结果中的字符串就会包含换行符。
var book = {
title: "js高级教程",
author: ["Nicholas C. Zakas"],
edition: 3,
year: 2011
}
var jsonText = JSON.stringify(book,null, 4);
console.log(jsonText);
输出结果:
{
"title": "js高级教程",
"author": [
"Nicholas C. Zakas"
],
"edition": 3,
"year": 2011
}
缩进字符串最长不超过10个字符长,超过则默认只显示10个字符串;
2.3 解析选项
JSON.parse()方法可以接受另外外一个参数,该参数为一个函数;为了区别JSON.stringify()接收的过滤函数,JSON.parse的函数参数称为还原函数;
实际上两个函数是相同的,都接收键和值两个参数,返回一个值;