关于JSON,最重要的是要理解它是一种数据格式。
JSON语法
- 简单值
数字、字符串、布尔值、null也是JSON的一种格式let numberJSON = JSON.parse(JSON.stringify(5)); let stringJSON = JSON.parse(JSON.stringify("hello")); let booleanJSON = JSON.parse(JSON.stringify(true)); let nullJSON = JSON.parse(JSON.stringify(null)); console.log(numberJSON, stringJSON, booleanJSON, nullJSON) // 5 'hello' true null
- 对象
表示的是一组无序的键值对 - 数组
不支持类型
-
JSON不支持undefined、function和date等数据类型。
let JavascriptObj = { a: 1, b: undefined, c: new Date(), d: ()=>{} } let JSON_DATA = JSON.parse(JSON.stringify(JavascriptObj)) console.log(JavascriptObj, JSON_DATA)
undefined 和 function 会被跳过,date对象会被转换为日期字符串。 -
在对象中value为NaN或者Infinity,会被转换为null
let book = { a: NaN, b: Infinity }; let bookJSON = JSON.stringify(book); console.log(bookJSON) // {"a":null,"b":null}
-
function、undefined、NaN、Infinitely在数组中会被转换为null
let book = [1,2,()=>{},undefined,null,0,NaN, Infinity]; let bookJSON = JSON.stringify(book); console.log(bookJSON) // [1,2,null,null,null,0,null,null]
-
JSON.stringify()方法会忽略对象的不可遍历属性
let obj = {}; Object.defineProperties(obj, { 'foo': { value: 1, enumerable: true }, 'bar': { value: 2, enumerable: false } }); console.log(JSON.stringify(obj)); // {"foo":1}]
-
在JSON中最后一个属性的后面不应有逗号,否则会报错
let JSONText = '{"name": "jack", "age": 2,}' console.log(JSON.parse(JSONText));
去掉尾逗号,可正常解析
let JSONText = '{"name": "jack", "age": 2}'
console.log(JSON.parse(JSONText));
JSON的两个方法
JSON对象有两个方法:stringify() 和 parse()
let book = {title: '红宝书', version: 3};
let bookCopy = JSON.parse(JSON.stringify({title: '红宝书', version: 3}));
console.log(book, bookCopy, book===bookCopy)
虽然book和bookCopy具有相同的属性,但是它们两个独立的没有任何关系的对象。
- JSON.stringify()
第2个参数是过滤器,第3个参数表示是否在JSON字符串中保留缩进。// 可以是数组 let book = {title: '红宝书', version: 3, sell: 1000}; let bookJSON = JSON.stringify(book, ['title', 'sell']); console.log(bookJSON) // {"title":"红宝书","sell":1000}
// 也可以是函数 let book = {title: '红宝书', version: 3, sell: 1000}; let bookJSON = JSON.stringify(book, (key, value)=>{ if(key=='title'){ return 888 }else if(key=='version'){ return undefined // 会被忽略 }else{ return value } }); console.log(bookJSON) // {"title":888,"sell":1000}
let book = {title: '红宝书', version: 3, sell: 1000}; let bookJSON = JSON.stringify(book, null, 3); console.log(bookJSON)
假设把一个对象传入JSON.stringify(),序列号该对象的顺序如下:
1、toJSON
2、如果有第二个参数,则应用这个函数过滤器
3、序列化
4、如果有第三个参数,则执行格式化 -
JSON.parse()