JSON认识
JSON,一种轻量级的文本数据交换格式,比XML更小更快,更易解析,爬虫经常要获取接口数据,接口数据就是JSON格式的。
格式示例
# 格式1:JSON 对象
{"name": "李嘉图", "age": 18}
# 格式2:JSON 数组
{
"student":
[
{"name": "李嘉图", "age": 18},
{"name": "凯撒", "age": 18},
{"name": "楚子航", "age": 18}
]
}
常用的JSON模块方法
方法 | 功能 |
---|---|
json.dumps(obj) | 将python数据类型转换为json格式的字符串 |
json.dump(obj, filePath) | 将python数据类型转换并保存到json格式的文件内 |
json.loads(s) | 将json格式的字符串转换为python的类型 |
json.load(filePath) | 从json格式的文件中读取数据并转换成python的类型 |
带s的都是和字符串相关的,不带s的都是和文件相关的。
json.dumps()
将python数据类型转换为json格式的字符串
test_json.py
# 导入json模块
import json
# 创建person的人员字典
person = {"name": "李嘉图", "age": 18, "sex": "男"}
print(type(person))
# 将python对象转换为json字符串
jsonStr = json.dumps(person)
print(type(jsonStr))
输出结果
<class 'dict'>
<class 'str'>
格式化json,使方便阅读
# 导入json模块
import json
# 创建person的人员字典
person = {"name": "李嘉图", "age": 18, "sex": "男"}
# 将python对象转换为json字符串
jsonStr = json.dumps(person)
print(jsonStr)
# json字符串格式化
print(json.dumps(person, sort_keys=True, indent=4, separators=(',', ': ')))
输出结果
{"name": "\u674e\u5609\u56fe", "age": 18, "sex": "\u7537"}
{
"age": 18,
"name": "\u674e\u5609\u56fe",
"sex": "\u7537"
}
- sort_keys:是否排序
- indent:定义缩进距离
- separators:是一个元组,定义分隔符类型
将json字符串写入json文件
json_write.py
# 导入json模块
import json
# 创建person的人员字典
person = {"name": "李嘉图", "age": 18, "sex": "男"}
# 将python对象转换为json字符串
jsonStr = json.dumps(person, sort_keys=True, indent=4, separators=(',', ': '))
# 写入文件
with open('json_write.json', 'w', encoding='utf-8') as f:
f.write(jsonStr)
运行程序
json.dump()
同样是将字符串存储到json格式的文件内,使用dump()不需要write()方法
# 导入json模块
import json
# 创建person的人员字典
person = {"name": "李嘉图", "age": 18, "sex": "男"}
# 将python对象转换为json字符串
json.dump(person, open('json_dump.json', 'w'), sort_keys=True, indent=4, separators=(',', ': '))
输出
直接写入文件用下面的方便点,但是如果在写入的过程中需要操作字符串的业务,就选上面那种。
json.loads()
# 导入json模块
import json
# 创建person的人员字典
person = {"name": "李嘉图", "age": 18, "sex": "男"}
# 将python对象转换为json字符串
jsonStr = json.dumps(person)
print(type(jsonStr))
# 将json字符串转换为python类型
python_type = json.loads(jsonStr)
print(python_type)
print(type(python_type))
输出结果
<class 'str'>
{'name': '李嘉图', 'age': 18, 'sex': '男'}
<class 'dict'>
在实际的业务中,获取到了接口的json数据,转换成python对象之后,就可以进行后续的业务操作。
读取json文件
# 导入json模块
import json
f = open('json_write.json')
json_str = f.read()
python_type = json.loads(json_str)
print(python_type)
print(type(python_type))
f.close()
输出
{'age': 18, 'name': '李嘉图', 'sex': '男'}
<class 'dict'>
json.load()
# 导入json模块
import json
python_type = json.load(open('json_write.json'))
print(python_type)
print(type(python_type))
输出
{'age': 18, 'name': '李嘉图', 'sex': '男'}
<class 'dict'>
两者不同之处,上面的传入的是json字符串,下面的传入的是文件对象。
json字符串解析
# 导入json模块
import json
# 将json文件中的json对象转换为python对象
python_type = json.load(open('json_write.json'))
# 解析python对象
print(python_type.keys())
print(python_type.values())
print(python_type["name"])
print(python_type["age"])
print(python_type["sex"])
输出结果
dict_keys(['age', 'name', 'sex'])
dict_values([18, '李嘉图', '男'])
李嘉图
18
男