关于JSON,最重要的是要理解它是一种数据格式,不是一种编程语言。
20.1 语法
20.1.1 简单值
"Hello World"
JS字符串和JSON字符串最大的区别在于,JSON字符串必须使用双引号(单引号会导致语法错误。)
20.1.2 对象
//js字面量
var object = {
"name": "NICK",
"age": 29
}
//JSON
{
"name": "NICK",
"age": 29
}
与JS对象字面量相比,JSON有三个不一样的地方:
(1) JSON没有声明变量,JSON中没有变量的概念。
(2) JSON没有末尾的分号。
(3) JSON对象的属性必须加双引号。
20.1.3 数组
JS数组字面量:
var values = [25, "hi", true];
JSON数组表示法:
[25, "hi", true];
20.2 解析与序列化
20.2.1 JSON对象
JSON对象有两个方法:
stringify():把JS对象序列化为JSON字符串
parse():把JSON字符串解析为原生JS值
var book = {
title: 'js',
authors: [
'Nick'
],
edition: 3,
year: 2011
}
var jsonText = JSON.stringify(book);
==> {"title":"js","authors":["Nick"],"edition":3,"year":2011};
var book = '{"title":"js","authors":["Nick"],"edition":3,"year":2011}';
var jsonText = JSON.parse(book);
console.log(jsonText)
20.2.2 序列化选项
JSON.stringify() 还接收另外两个参数,第一个是过滤器,可以是一个数组,也可以是一个函数;
第二个是一个选项,表示是否在 JSON 字符串中保留缩进。
- 过滤结果:
var book = {
title: 'js',
authors: [
'Nick'
],
edition: 3,
year: 2011
}
var jsonText = JSON.stringify(book, ["title", "edition"]);
==> "{"title":"js","edition":3}"
var book = {
title: 'js',
authors: [
'Nick'
],
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;
}
})
==> "{"title":"js","authors":"Nick","year":5000}"
- 字符串缩进
var book = {
title: 'js',
authors: [
'Nick'
],
edition: 3,
year: 2011
}
var jsonText = JSON.stringify(book, null, 4);
console.log(jsonText)
==》
{
"title": "js",
"authors": [
"Nick"
],
"edition": 3,
"year": 2011
}
var book = {
title: 'js',
authors: [
'Nick'
],
edition: 3,
year: 2011
}
var jsonText = JSON.stringify(book, null, '--');
==>
{
--"title": "js",
--"authors": [
----"Nick"
--],
--"edition": 3,
--"year": 2011
}
- toJSON() 方法
假设把一个对象传入 JSON.stringify(), 序列化该对象的顺序如下:
(1) 如果存在 toJSON() 方法而且能够通过它取得有效的值,则调用该方法。否则,按照默认顺序执行序列化。
(2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第一步返回的值。
(3) 对第二步返回的每个值进行相应的序列化。
(4) 如果提供了第三个参数,执行相应的格式化。