模块课程(1/4)
JSON:序列化和解析
JSON 是最广泛使用的数据交换格式。 json 模块位于
标准库本地处理它。
从 Python 到 JSON:dumps
json.dumps(object) 将 Python 对象序列化为 JSON 字符串。
import json
dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'
json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sorted从 JSON 到 Python:loads
json.loads(string) 解析 JSON 字符串并返回 Python 对象。
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"] # 'Ada'
type(d) # <class 'dict'>类型映射
| JSON | 蟒蛇 |
| -------- | --------------- | ------- |
| object | dict |
| array | list |
| string | str |
| number | int / float |
| true | true True |
| false | False | False |
| null | None | None |
来自文件:dump / load
with open("config.json", "w") as f:
json.dump(dati, f, indent=2)
with open("config.json") as f:
dati = json.load(f)如果没有尾随“s”,它们将处理文件(类似文件),而“s”则处理字符串。
不可序列化类型:default
datetime、set,您的自定义类默认情况下不可序列化:
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable您可以传递一个 default 函数来告诉如何转换它们:
def converti(obj):
if isinstance(obj, datetime.datetime):
return obj.isoformat()
if isinstance(obj, set):
return list(obj)
raise TypeError(f"non serializzabile: {type(obj)}")
json.dumps({"ora": datetime.datetime.now()}, default=converti)JSON 和文件操作
标准库还提供 json.dump() 和 json.load() (不带 's')来直接向文件写入和读取 JSON 数据,与上下文管理器自然配对:
with open("data.json", "w") as f:
json.dump(data, f)尝试一下
给定 `data = {'nome': 'Ada', 'anni': 36}`,使用 indent=2 将其序列化为 JSON,并分配给变量 `json_str`。评估“json_str”。
显示提示
json.dumps(数据, 缩进=2)
3 次尝试后可用的解决方案
复习练习
给定 JSON 字符串 s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]',使用 json.loads 将其解析为数据并计算 'v' 值的总和。评价总计。
显示提示
json.loads 返回一个字典列表。
3 次尝试后可用的解决方案
额外的挑战
给定 JSON 字符串 json_data = '{"name": "Alice", "age": 30}',使用 json.loads 将其解码为 Python 字典。提取与“name”键关联的值并将其存储在“user_name”中。最后,评估“user_name”。
显示提示
使用 json.loads(json_data) 解码,然后通过 data['name'] 访问。
3 次尝试后可用的解决方案