JSON是一种轻量级的数据交换格式。所谓轻量级是与XML相比较而言的。相比而言,它所描述项目的字符更少。
1.JSON文档结构
构成JSON文档的结构有2种,一种是对象,一种就是数组。
1.1 对象
JSON对象是一个无序的键值对集合,其形式为{键:值},类似于python的字典。键是字符串类型,值可以是任何合法的JSON类型
下面举一个JSON对象的例子
{
"name": "runoob",
"url": "www.runoob.com"
}
1.2 数组
JSON数组是一个包含一个或多个值的有序集合,以[开始,以]结束
下面举一个JSON数组的例子
[ { "name": "菜鸟教程", "url": "www.runoob.com" }, { "name": "google", "url": "www.google.com" }, { "name": "微博", "url": "www.weibo.com" } ]
2.JSON数据类型
2.1 对象
参照1.1
2.2 数组
参照1.2
2.3 数字
可以是整数或者浮点数
{
"age": 30
}
2.4 布尔值
取值为true或false
{
"flag": true
}
2.5 null
{
"runoob": null
}
2.6 字符串
字符串必须在双引号之中,不能换成单引号
3.JSON类型和python类型的映射
.JSON类型和python类型的映射如下表所示
| python | JSON |
|---|---|
| 字典 | 对象 |
| 列表、元组 | 数组 |
| 字符串 | 字符串 |
| 整数、浮点数等类型 | 数字 |
| True | true |
| False | false |
| None | null |
4.JSON数据编码
要想将python数据在网络中进行传输和存储,需要将python数据转换为JSON数据再进行传输和存储,这个过程称之为编码
4.1 dumps函数
该函数将编码的结果以字符串形式返回
import json
data = {
'no': 1,
'name': 'Runoob',
'url': 'http://www.runoob.com'
}
print(f'JSON编码前的数据类型为:{type(data)}')
json_obj = json.dumps(data)
print(json_obj)
print(f'JSON编码后的数据类型为:{type(json_obj)}')
result:
JSON编码前的数据类型为:<class 'dict'>
{"no": 1, "name": "Runoob", "url": "http://www.runoob.com"}
JSON编码后的数据类型为:<class 'str'>
4.2 dump函数
该函数是将编码的结果保存到文件对象中
保存文件前的情形如下:
import json
data = {
'no': 1,
'name': 'Runoob',
'url': 'http://www.runoob.com'
}
with open('json_dump.json', 'w') as f:
json.dump(data, f)
保存文件后的情形如下:
json_dump.txt的内容如下:
5.JSON数据解码
要想从网络中接收或者磁盘中读取JSON数据,需要将JSON数据转换为python数据再进行接收或读取,这个过程称之为解码
5.1 loads函数
该函数是将JSON字符串数据进行解码,并返回python数据
import json
data = {
'no': 1,
'name': 'Runoob',
'url': 'http://www.runoob.com'
}
json_obj = json.dumps(data)
print(f'JSON编码前的数据类型为:{type(json_obj)}')
data2 = json.loads(json_obj)
print(data2)
print(f'JSON编码后的数据类型为:{type(data2)}')
result:
JSON编码前的数据类型为:<class 'str'>
{'no': 1, 'name': 'Runoob', 'url': 'http://www.runoob.com'}
JSON编码后的数据类型为:<class 'dict'>
5.2 load函数
该函数是读取文件对象中的JSON字符串数据,并对其进行解码,,并返回python数据
import json
with open('json_dump.json', 'r') as f:
data = json.load(f)
print(data)
print(f'data的类型为:{type(data)}')
result:
{'no': 1, 'name': 'Runoob', 'url': 'http://www.runoob.com'}
data的类型为:<class 'dict'>