JSON
官方文档: https://docs.python.org/zh-cn/3.12/library/json.html
Python 提供 json 模块来处理 JSON 数据:
import json
data = json.loads('{"a": 1, "b": 2}')
print(data) # {'a': 1, 'b': 2}
s = json.dumps({"a": 1, "b": 2})
print(s) # '{"a": 1, "b": 2}'
with open("config.json") as f:
data = json.load(f)
with open("config.json", "w") as f:
json.dump({"x": 10}, f)
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | str |
| number | int / float |
| true / false | True / False |
| null | None |
让 JSON 更漂亮:
print(json.dumps(data, indent=4))
默认:中文会变成 Unicode:
json.dumps({"name": "张三"})
# {"name": "\u5f20\u4e09"}
正确:
json.dumps({"name": "张三"}, ensure_ascii=False)
# {"name": "张三"}
json.dumps(data, sort_keys=True)
例如:datetime / Decimal
import json
from datetime import datetime
result = json.dumps(
{"time": datetime.now()},
default=str, # 自动转字符串
ensure_ascii=False
)
让所有“不能 JSON 化的对象”自动变字符串。
JSON 不能处理:
- 单引号
{ 'x': 1 } - 结尾多逗号
{ "x": 1, } - 注释 //
- datetime
- Decimal
- bytes
解决:
- 建议用 default=str 自动转格式
- 或用第三方库 orjson 更智能
json.loads("{'a': 1}")
# JSONDecodeError: Expecting property name enclosed in double quotes
必须改成:
json.loads('{"a": 1}')
自定义类 -> JSON
class User:
def __init__(self, name):
self.name = name
def encode(obj):
if isinstance(obj, User):
return {"name": obj.name}
raise TypeError("无法序列化")
u = User("martin")
print(json.dumps(u, default=encode, ensure_ascii=False))
用 object_hook:
def as_user(d):
if "name" in d:
return User(d["name"])
return d
user = json.loads('{"name": "martin"}', object_hook=as_user)
不要一次性加载超大 JSON 文件!
推荐:逐行读取 NDJSON(JSON Lines)
{"a":1}
{"a":2}
解析:
with open("log.jsonl") as f:
for line in f:
item = json.loads(line)
process(item)
import orjson
orjson.dumps(data)
orjson.loads(s)
比内置 json 快 5–20 倍。
| 类型 | 解决方案 |
|---|---|
| datetime | default=str 或自定义序列化 |
| Decimal | float(x) 或 default=str |
| bytes | .decode() |
| set | list(set) |
例子:
json.dumps({"data": {1,2,3}}, default=list)
json.dumps((1,2,3))
# [1, 2, 3]
{
// 不行
"a": 1
}
- JSON 字符串 -> Python: loads()
- Python -> JSON 字符串: dumps()
- 文件读取/写入用:load() / dump()
- 输出中文要:ensure_ascii=False
- 排序:sort_keys=True
- 美化:indent=4
- 无法序列化对象:用 default=str
- JSON 要用双引号,不允许注释
- 超大 JSON 用逐行解析(JSON Lines)
- 性能敏感场景推荐 orjson