一、背景
曾经有一段时间,XML是互联网传输结构化数据的标准。但是XML过于繁琐、冗长。JSON2001年就开始应用了,2006年,DC才把Json提交给IETF.
与XML相比,Json是在JavaScript中读写结构化数据的更好的方式。
Json是一种数据格式,不是编程语言,不局限与JavaScript,很多语言都有针对Json的解析器和序列器。
Json可以表示三种类型值:简单值、对象、数组。JavaScript字符串与Json字符串最大的区别在于Json字符串必须使用双引号(单引号会导致语法错误)
二、语法
1.简单值:Json字符串必须使用双引号(不然会导致语法错误),JavaScript的字符串可单可双
2.对象:Javascript 与 Json稍有不同//Javascript:
var person = { name: "Mike", age: 29 };
//Javascript也可以这样写: var person = { "name": "Mike", "age": 29 };
// 注意,必须有分号结尾,因为这是javascript语句
// Json的对象, 与javascript对象不同有2个地方,1.没有声明变量 2.末尾没有分号,因为它不是js语句 { "name": "Mike", "age": 29 }
3.数组:
// 下面是javascript中的数组字面量 var values = [25, "hi", true];
// JSON数组也没有变量与分号 [25, "hi", true]
三、核心优势
Json之所以流行,是因为可以把JSON数据结构解析为有用的JavaScript对象,在解析为JavaScript对象后,取数据极其简单
// 取得第三本书的书名 books[2].title
四、两个方法
早期JSON解析器基本上是用javascript的eval函数,因为JSON是Javasciprt语法的子集,所以eval能解析、解释并返回javasciprt的对象、数组。但是ES5对此进行规范,定义了全局JSON对象,它有以下两种方法:
// JSON.stringify() 把JavaScript对象序列化为JSON字符串 var book = {title: '《十万个为什么》'} var jsonText = JSON.stringify(book) console.log(jsonText) // 输出字符串 {"title":"十万个为什么"} // 该字符串不包含任何空格字符或缩进,值为undefined的任何属性会被跳过 // JSON.parse() 把JSON字符串解析为原生JavaScript值 var bookCopy = JSON.parse(jsonText) // 这里的bookCopy与book具有相同属性,但是彼此独立,没有任何关系
五、两个方法的详细运用
5.1 JSON.stringify(js对象, 参数一/参数二, 参数三)
// 1) 参数一: 过滤器 var book = { "title": "Professional JavaScript", "authors": ["My name is Psg"], year: 2017 } var jsonText = JSON.stringify(book, ["title", "year"]) console.log(jsonText) // 输出:{"title": "Professional JavaScript","year": 2017} // 2) 参数二: 函数(可传入两个参数:键-值) jsonText = JSON.stringify(book, function(key, value) { switch(key) { case "authors": return value.join(",") case "year": return 5000 case "title": return undefined default: return value } }) console.log(jsonText) // 输出:{"authors": ""My name is Psg","year": 5000} // 注意,如果js对象转json字符串,值为undefined,会自动删除该键值对 // 3) 参数三: 字符串缩进 var jsonText = JSON.stringify(book, null, 4) console.log(jsonText) // 在控制台输出: //{ // "title": "Professional JavaScript", // "authors": ["My name is Psg"], // year: 2017 //} // 看到没有,自动换行加缩进4个字符
5.1 JSON.parse(js对象, 参数二)
为什么叫参数二,是因为它和stringify的参数二一样,是一个函数,该函数也可以传入两个参数(键-值),用法一样,就重复了。