JSON这个对象经常可以看到,但是可能里面详细的一些用法,不常见的,得时常拿出来复习复习
序列化
让我们先把小明这个对象序列化成JSON格式的字符串:
1 2 3 4 5 6 7 8 9 10 11
| var xiaoming = { name: '小明', age: 14, gender: true, height: 1.65, grade: null, 'middle-school': '\"W3C\" Middle School', skills: ['JavaScript', 'Java', 'Python', 'Lisp'] }; JSON.stringify(xiaoming);
|
要输出得好看一些,可以加上参数,按缩进输出:
1
| JSON.stringify(xiaoming, null, ' ');
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "name": "小明", "age": 14, "gender": true, "height": 1.65, "grade": null, "middle-school": "\"W3C\" Middle School", "skills": [ "JavaScript", "Java", "Python", "Lisp" ] }
|
第二个参数用于控制如何筛选对象的键值,如果我们只想输出指定的属性,可以传入Array
1
| JSON.stringify(xiaoming, ['name', 'skills'], ' ');
|
还可以传入一个函数,这样对象的每个键值对都会被函数先处理:
1 2 3 4 5 6 7
| function convert(key, value) { if (typeof value === 'string') { return value.toUpperCase(); } return value; } JSON.stringify(xiaoming, convert, ' ');
|
上面的代码把所有属性值都变成大写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "name": "小明", "age": 14, "gender": true, "height": 1.65, "grade": null, "middle-school": "\"W3C\" MIDDLE SCHOOL", "skills": [ "JAVASCRIPT", "JAVA", "PYTHON", "LISP" ] }
|
如果我们还想要精确控制如何序列化小明,可以给xiaoming定义一个toJSON()的方法,直接返回JSON应该序列化的数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var xiaoming = { name: '小明', age: 14, gender: true, height: 1.65, grade: null, 'middle-school': '\"W3C\" Middle School', skills: ['JavaScript', 'Java', 'Python', 'Lisp'], toJSON: function () { return { 'Name': this.name, 'Age': this.age }; } }; JSON.stringify(xiaoming);
|
反序列化
拿到一个JSON格式的字符串,我们直接用JSON.parse()把它变成一个JavaScript对象
1 2 3 4
| JSON.parse('[1,2,3,true]'); JSON.parse('{"name":"小明","age":14}'); JSON.parse('true'); JSON.parse('123.45');
|
JSON.parse()还可以接收一个函数,用来转换解析出的属性
1 2 3 4 5 6 7
| JSON.parse('{"name":"小明","age":14}', function (key, value) { if (key === 'name') { return value + '同学'; } return value; });
|