JSON数据格式

JSON

JSON 是一种数据格式,不是一种编程语言。一般用于Web服务的前后端的数据交流格式。

一、类型

JSON 的语法可以有3种类型的值:

  • 简单值:包括字符串、数值、布尔值和 null(但是不支持 Javascript 中的 undefined)
  • 对象:表示一组无序的键值对
  • 数组:表示一组有序的值的列表

二、与 Jsvacript 的区别

  • Javascript 是一种编程语言,JSON只是一种数据格式
  • JSON 没有变量声明,也没有末尾的分号;
  • JSON 字符串必须使用双引号(单引号会导致语法错误)

Javascript 的语法:

1
2
3
4
var object = {
name: 'Zhangsan'
age: 20
}

JSON 的语法:

1
2
3
4
{
"name": "Zhangsan",
"age": 20
}

三、解析与序列化

JSON 数据是 Web 服务中数据交换的格式,因此它可以与 Javascript 对象相互转换。

早期的浏览器,一般使用 eval() 函数来解析、解释 JSON 字符串并返回 Javascript 对象或数组。

ECMAScript 5 对解析 JSON 的行为进行来规范,定义了全局对象 JSON。

JSON 对象有两个方法:stringify()parse()。其中 stringify() 用于将 Javascript 对象或数组序列化成 JSON 字符串,parse() 方法用于将 JSON 字符串解析成 avascript 对象或数组。

3.1 序列化

JSON 序列化负责将 Javascript 对象或数组序列化成 JSON 字符串,实现这个功能的方法是 JSON.stringify()

stringify 方法的参数有3个:

  • 需要序列化的 Javascript 对象
  • 过滤器,可以是数组,也可以是函数
  • JSON 字符串的缩进值,可以是数值,也可以是字符串

例如:

1
2
3
4
5
6
7
var jsonObj = {
name: 'Zhangsan',
age: 20
};

// Javascript 对象序列化
var jsonText = JSON.stringify(jsonObj);

jsonText 的值为:

1
{"name":"Zhangsan","age":20}

3.1.1 过滤器

使用 stringify 的第2个参数,可以自定义过滤序列化的结果。

过滤器参数可以有2种格式:数组和函数。

1)如果过滤器参数是数组,那么 stringify 序列化的结果只会返回包含在数组中的属性:

1
2
3
4
5
6
7
var jsonObj = {
name: 'Zhangsan',
age: 20
};

// 过滤器是数组
var jsonText = JSON.stringify(jsonObj, ['name']);

jsonText 的值为:

1
{"name":"Zhangsan"}

2)如果过滤器参数是函数,该函数会接收2个参数:属性(键)名和属性值。

函数返回值就是对应属性(键)名的值,如果函数返回值是 undefined,那么相应的属性会被忽略:

1
2
3
4
5
6
7
8
9
10
11
12
var jsonObj = {
name: 'Zhangsan',
age: 20
};

// 过滤器是函数
var jsonText = JSON.stringify(jsonObj, function (key, value) {
if (key === 'name') {
return value;
}
return undefined;
});

jsonText 的值为:

1
{"name":"Zhangsan"}

3.1.2 缩进

默认情况下,JSON.stringify() 输出的 JSON 字符串是不包含任何空格字符或缩进的:

1
2
3
4
5
6
7
var jsonObj = {
name: 'Zhangsan',
age: 20
};

// Javascript 对象序列化
var jsonText = JSON.stringify(jsonObj);

jsonText 的值为:

1
{"name":"Zhangsan","age":20}

使用 stringify 方法的第3个参数,可以控制序列化结果中的缩进和空白符。

缩进参数可以有2种格式:数值和字符串。

1)如果缩进参数是数值,表示的是每个缩进级别的空格数:

1
2
3
4
5
6
7
var jsonObj = {
name: 'Zhangsan',
age: 20
};

// Javascript 对象序列化
var jsonText = JSON.stringify(jsonObj, null, 4);

jsonText 的值为(缩进空格数为4):

1
2
3
4
{
"name": "Zhangsan",
"age": 20
}

只要传入了有效的缩进参数值,结果字符串也会包含换行符(因为只缩进不换行意义不大)。

最大缩进格数为10,所有大于10的值都会自动转换为10。

2)如果缩进参数是字符串,则这个字符串将会被用作缩进字符(不再使用空格):

1
2
3
4
5
6
7
var jsonObj = {
name: 'Zhangsan',
age: 20
};

// Javascript 对象序列化
var jsonText = JSON.stringify(jsonObj, null, '----');

jsonText 的值为(缩进字符不再是空格):

1
2
3
4
{
----"name": "Zhangsan",
----"age": 20
}

缩进字符最大长度也不能超过10,如果字符长度超过了10,就会被截取成10个字符。

3.1.3 toJSON

有时候,JSON.stringify() 还不能满足自定义序列化的需求,因此可以给对象定义 toJSON 方法,返回自定义的 JSON 数据格式。

1
2
3
4
5
6
7
8
9
10
var jsonObj = {
name: 'Zhangsan',
age: 20,
toJSON: function () {
return {"sex": "female"};
}
};

// Javascript 对象序列化
var jsonText = JSON.stringify(jsonObj);

jsonText 的值为(缩进字符不再是空格):

1
{"sex": "female"}

3.1.4 序列化顺序

  1. 如果存在 toJSON 方法,返回该方法的返回值,否则,返回对象本身
  2. 如果提供了第2个参数,对第1步返回的值进行过滤
  3. 对第2步返回的每个值进行序列化
  4. 如果提供了第3个参数,执行相应的格式化

3.2 解析

JSON 解析负责将 JSON 字符串解析成 Javascript 对象,实现这个功能的方法是 JSON.parse()

parse 方法的参数有2个:

  • 需要解析的 JSON 字符串
  • 还原函数,和过滤器函数类似

例如:

1
2
3
4
var jsonText = '{"name":"Zhangsan","age":20}';

// JSON 数据解析
var jsonObj = JSON.parse(jsonText);

jsonObj 的值为:

1
2
3
4
{
name: "Zhangsan",
age: 20,
}

3.2.1 还原函数

还原函数和过滤器函数类似,也是接收2个参数:属性(键)名和属性值。

还原函数的返回值将作为属性(键)名的值,如果函数返回 undefined,表示从结果中删除相应的键。

1
2
3
4
5
6
7
8
9
var jsonText = '{"name":"Zhangsan","age":20}';

// JSON 数据解析,增加还原函数
var jsonObj = JSON.parse(jsonText, function (key, value) {
if (key === 'name') {
return value;
}
return undefined;
});

jsonObj 的值为:

1
2
3
{
name: "Zhangsan"
}
作者

jiaduo

发布于

2021-08-28

更新于

2023-04-02

许可协议