如何第一时间看到新文章?
收藏本博客列表页,并在首页与工具聚合页留意指南入口。阅读文章无需注册或邮件订阅。
详解 Python 中 json 模块的高阶用法:自定义 Encoder 处理日期时间、ensure_ascii 解决中文乱码、流式读取 GB 级 JSON,并对比 orjson/ujson 性能。
在 Python 开发里,JSON 几乎是后端接口、日志处理与数据交换的默认格式。看起来简单的 json.dumps() / json.loads(),一旦碰到日期时间、中文字符和大文件,就很容易出错或性能下降。
本文基于真实开发场景,整理一套可直接落地的实践方案,覆盖:
loads/dumps 与 load/dump 的正确使用边界datetime 不能序列化的稳定解法ensure_ascii=False 处理中文可读性ijson)orjson / ujson 的性能取舍loads/dumps 与 load/dump 的区别json.dumps(obj):Python 对象 -> JSON 字符串json.loads(text):JSON 字符串 -> Python 对象json.dump(obj, file):Python 对象 -> 写入文件json.load(file):文件 -> Python 对象简单记法:带 s 是字符串,不带 s 是文件。
当对象里包含 datetime 时,直接序列化会报错:
from datetime import datetime
import json
json.dumps({"now": datetime.now()})
# TypeError: Object of type datetime is not JSON serializable推荐方案是自定义 JSONEncoder:
from datetime import datetime, date
import json
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
if isinstance(obj, date):
return obj.isoformat()
return super().default(obj)
payload = {"now": datetime.now(), "today": date.today()}
print(json.dumps(payload, cls=DateTimeEncoder, ensure_ascii=False, indent=2))如果你希望固定格式(如 YYYY-MM-DD HH:MM:SS),可以把 isoformat() 替换为 strftime()。
\uXXXX 的原因默认情况下,json.dumps() 会转义非 ASCII 字符:
import json
print(json.dumps({"message": "你好,世界"}))
# {"message": "\u4f60\u597d\uff0c\u4e16\u754c"}改成如下即可保持中文可读:
import json
print(json.dumps({"message": "你好,世界"}, ensure_ascii=False))写文件时同时指定 encoding="utf-8":
with open("data.json", "w", encoding="utf-8") as f:
json.dump({"message": "你好,世界"}, f, ensure_ascii=False)一次性 json.load() 读大数组很容易占满内存。实践上有两条路线:
.jsonl)每行一条 JSON,天然适合流式处理:
import json
def read_jsonl(path):
with open(path, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
yield json.loads(line)
for obj in read_jsonl("events.jsonl"):
pass # 逐条处理ijsonpip install ijsonimport ijson
def iter_huge_array(path):
with open(path, "rb") as f:
for item in ijson.items(f, "item"):
yield itemorjson / ujsonjson:稳定、零依赖、兼容性最好orjson:性能通常更强,且对 datetime 支持友好ujson:上手简单,性能也有提升,但边缘行为需验证示例(orjson):
import orjson
from datetime import datetime
data = {"name": "Alice", "now": datetime.now()}
raw = orjson.dumps(data) # bytes
obj = orjson.loads(raw)loads/dumps,文件场景用 load/dumporjsonensure_ascii=False这套工具在浏览器本地运行,输入数据不会上传服务器,适合快速验证与调试 JSON。
致力于为开发者提供最佳的 JSON 处理工具
更多文章即将发布...
返回博客关于跟进更新、选题方向与互动反馈。
收藏本博客列表页,并在首页与工具聚合页留意指南入口。阅读文章无需注册或邮件订阅。
围绕 JSON 校验、格式化、转换与调试流程,以及 JSON Work 工具更新,与在线工具的本地能力一一对应。
可以。请通过关于页的联系方式或 GitHub 反馈;我们会优先安排贴近真实开发场景的教程。