跳转到主要内容
模块 8 · 第 1 课(共 4)课程中的29/36~10 min
模块课程(1/4)

JSON:序列化和解析

JSON 是最广泛使用的数据交换格式。 json 模块位于 标准库本地处理它。

从 Python 到 JSON:dumps

json.dumps(object) 将 Python 对象序列化为 JSON 字符串。

Python
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 对象。

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

Python
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,您的自定义类默认情况下不可序列化:

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

您可以传递一个 default 函数来告诉如何转换它们:

Python
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 数据,与上下文管理器自然配对:

Python
with open("data.json", "w") as f:
    json.dump(data, f)

尝试一下

锻炼#python.m8.l1.e1
尝试:0加载中...

给定 `data = {'nome': 'Ada', 'anni': 36}`,使用 indent=2 将其序列化为 JSON,并分配给变量 `json_str`。评估“json_str”。

正在加载编辑器...
显示提示

json.dumps(数据, 缩进=2)

3 次尝试后可用的解决方案

复习练习

锻炼#python.m8.l1.e2
尝试:0加载中...

给定 JSON 字符串 s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]',使用 json.loads 将其解析为数据并计算 'v' 值的总和。评价总计。

正在加载编辑器...
显示提示

json.loads 返回一个字典列表。

3 次尝试后可用的解决方案

额外的挑战

锻炼#python.m8.l1.e3
尝试:0加载中...

给定 JSON 字符串 json_data = '{"name": "Alice", "age": 30}',使用 json.loads 将其解码为 Python 字典。提取与“name”键关联的值并将其存储在“user_name”中。最后,评估“user_name”。

正在加载编辑器...
显示提示

使用 json.loads(json_data) 解码,然后通过 data['name'] 访问。

3 次尝试后可用的解决方案