JSON是一种数据格式,不是一种编程语言。
一、语法
JSON语法可以表示以下三种类型的值:简单值、对象、数组。
1、简单值
最简单的JSON数据值就是简单值:
5 "hello world"
2、对象
JSON对象与JAVASCRIPT字面量有些不同,以下是javascript中的对象字面量:
// 表示方法1 var person = { name:"Lillian", age:24 }; // 表示方法2 var person1 = { "name":"Lillian", "age":24 };
JSON对象有两个不一样的地方,1)没有声明变量(JSON对象中没有变量的概念);2)没有末尾的分号;3)对象的属性必须加双引号
//json表示上述对象的方式 { "name":"Lillian", "age":24 }
{ "name":"Lillian", "age":24, "school":{ "name":"CQUPT", "location":"ChongQing" } }
3、数组
JSON表示数组:
[25,"hi",true]
把对象和数组结合起来,可以表示复杂的数据结构:
[ { "title": "professional javascript", "author": [ "Matthew" ], "edtion": 3, "year": 2011 }, { "title": "professional javascript", "author": [ "Matthew" ], "edtion": 4, "year": 2012 }, { "title": "professional javascript", "author": [ "Matthew" ], "edtion": 5, "year": 2013 }, { "title": "professional javascript", "author": [ "Matthew" ], "edtion": 6, "year": 2014 }, { "title": "professional javascript", "author": [ "Matthew" ], "edtion": 7, "year": 2015 } ]
二、序列化选项
与XML数据结构要解析成DOM文档而且从中提取数据极为麻烦相比,JSON可以解析为JAVASCRIPT的优势及其明显。
1、JSON对象
// JSON对象有两个方法,分别用于把Javascript对象序列化成json字符串和把json字符串解析为原生javascript值 var book = { title:"professional javascript", authors:[ "Matthew" ], edition:3, year:2016 }; // 序列化成字符串 var jsonText= JSON.stringify(book); alert(jsonText); // 创建json对象 var bookCopy = JSON.parse(jsonText); alert(bookCopy);
2、过滤结果和缩进
JSON.stringify()除了要序列化的javascript对象外,还可以接受另外两个参数:第一个参数是一个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。
// exampl1: 过滤器是数组 var book = { title:"professional javascript", authors:[ "Matthew", "Lillian" ], edition:3, year:2016 }; var jsonText = JSON.stringify(book, ["title","edition"]); // example2:过滤器是函数 var jsonText2 = JSON.stringify(book, function(key, value){ switch(key){ case "authors": return value.join(","); case "edition": return undefined; //相当于去掉 case "year": return 5000; default: return value; //相当于保留原值 } }); // example3: 第三个参数表示每个级别缩进的空格数 var jsonText3 = JSON.stringify(book, null,8); // example4: 第三个参数是非数值,则在JSON字符串中被用作缩进字符 var jsonText4 = JSON.stringify(book, null,"A");
3、toJSON方法
toJSON可以作为函数过滤器的补充,如果存在toJSON方法而且能够通过它取得有效值,那么调用该方法;否则,按默认顺序执行序列化
// 可以为任何对象添加toJSON方法 // 如果存在toJSON方法而且能够通过它取得有效值,那么调用该方法;否则,按默认顺序执行序列化 var book = { title:"professional javascript", authors:[ "Matthew", "Lillian" ], edition:3, year:2016, toJSON:function(){ return this.title; } }; var jsonText = JSON.stringify(book);
三、解析选项
JSON.stringify()可以接受两个参数,第二个参数如果是一个函数,将在每个键值对上调用:
var book = { title:"professional javascript", authors:[ "Matthew", "Lillian" ], edition:3, year:2016, // 调用JSON.stringify会解析每一个选项,因此以下的date对象也会被解析成字符串 releaseDate:new Date(2016,8,13) }; var jsonText = JSON.stringify(book); var bookCopy = JSON.parse(jsonText, function(key, value){ // 被还原成了Date对象 if(key == "releaseDate"){ return new Date(value); }else{ return value; } }); // releaseDate被还原成了对象,因此可以调用getFullYear()方法 alert(bookCopy.releaseDate.getFullYear());