
免费python编程教程:https://pan.quark.cn/s/2c17aed36b72
在数据驱动的编程世界中,JSON(JavaScript Object Notation)已成为跨平台数据交换的标准格式。Python通过内置的json模块,为开发者提供了简洁高效的工具集,无需安装第三方库即可完成JSON数据的序列化与反序列化。本文将以通俗易懂的方式,结合实际案例,深入解析json模块的核心功能、参数配置及进阶用法。

JSON以键值对(Key-Value)为核心结构,支持嵌套对象和数组,具有轻量级、易读写的特点。例如,一个用户信息可以表示为:
{
"name": "张三",
"age": 28,
"hobbies": ["阅读", "旅行"]
}
这种格式既适合人类阅读,也能被大多数编程语言快速解析,成为API接口、配置文件的首选格式。
Python的字典(dict)和列表(list)与JSON结构高度相似。例如:
user_data = {
"name": "张三",
"age": 28,
"hobbies": ["阅读", "旅行"]
}
通过json模块,可轻松实现Python对象与JSON字符串的相互转换。
json模块提供四个核心函数,分别处理字符串与文件的转换:
函数 | 作用 | 输入类型 | 输出类型 |
|---|---|---|---|
json.dumps() | Python对象→JSON字符串 | dict/list等 | str |
json.loads() | JSON字符串→Python对象 | str | dict/list等 |
json.dump() | Python对象→JSON文件 | dict/list等 | 文件写入 |
json.load() | JSON文件→Python对象 | 文件读取 | dict/list等 |
场景1:将字典转为JSON字符串
import json
data = {"name": "李四", "score": 95}
json_str = json.dumps(data)
print(json_str) # 输出: {"name": "李四", "score": 95}
场景2:从JSON字符串还原字典
json_str = '{"name": "王五", "score": 88}'
data = json.loads(json_str)
print(data["name"]) # 输出: 王五
场景3:写入JSON文件
data = {"product": "手机", "price": 2999}
with open("product.json", "w", encoding="utf-8") as f:
json.dump(data, f)
场景4:读取JSON文件
with open("product.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data["price"]) # 输出: 2999
indent与separators默认生成的JSON字符串紧凑无换行,通过indent参数可实现层级缩进:
data = {"a": 1, "b": {"c": 2}}
pretty_json = json.dumps(data, indent=4)
print(pretty_json)
输出:
{
"a": 1,
"b": {
"c": 2
}
}
separators参数可自定义分隔符,去除多余空格:
compact_json = json.dumps(data, separators=(",", ":"))
print(compact_json) # 输出: {"a":1,"b":{"c":2}}
sort_keys通过sort_keys=True按字母顺序排列键:
data = {"b": 2, "a": 1}
sorted_json = json.dumps(data, sort_keys=True)
print(sorted_json) # 输出: {"a": 1, "b": 2}
ensure_ascii默认将非ASCII字符(如中文)转义为Unicode码:
data = {"name": "张三"}
print(json.dumps(data)) # 输出: {"name": "\u5f20\u4e09"}
设置ensure_ascii=False保留原字符:
print(json.dumps(data, ensure_ascii=False)) # 输出: {"name": "张三"}
Python类实例无法直接转为JSON,需通过default参数指定转换函数:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def student_encoder(obj):
if isinstance(obj, Student):
return {"name": obj.name, "age": obj.age}
raise TypeError("Object not serializable")
student = Student("赵六", 20)
json_str = json.dumps(student, default=student_encoder)
print(json_str) # 输出: {"name": "赵六", "age": 20}
通过object_hook参数将JSON字典还原为类实例:
def student_decoder(dct):
if "name" in dct and "age" in dct:
return Student(dct["name"], dct["age"])
return dct
json_str = '{"name": "钱七", "age": 22}'
student = json.loads(json_str, object_hook=student_decoder)
print(student.name) # 输出: 钱七
JSON标准不支持日期类型,需手动转换为字符串:
from datetime import datetime
data = {"event": "会议", "time": datetime.now()}
def date_encoder(obj):
if isinstance(obj, datetime):
return obj.isoformat()
return obj
json_str = json.dumps(data, default=date_encoder)
print(json_str) # 输出: {"event": "会议", "time": "2025-10-20T12:00:00"}
解析时可能遇到格式错误的JSON字符串,需用try-except捕获异常:
invalid_json = '{"name": "孙八",}'
try:
data = json.loads(invalid_json)
except json.JSONDecodeError as e:
print(f"JSON解析错误: {e}") # 输出: JSON解析错误: Expecting property name enclosed in double quotes
读写文件时建议使用with语句自动管理资源,并处理文件不存在等异常:
try:
with open("nonexistent.json", "r") as f:
data = json.load(f)
except FileNotFoundError:
print("文件不存在")
except json.JSONDecodeError:
print("文件内容非有效JSON")
对于大型JSON文件,可使用ijson库逐项解析,避免内存溢出:
import ijson
with open("large_data.json", "r") as f:
for item in ijson.items(f, "item"):
print(item) # 逐项处理
写入大量数据时,可先构建完整字典再一次性写入:
data_list = [{"id": i, "value": f"item_{i}"} for i in range(10000)]
with open("bulk_data.json", "w") as f:
json.dump(data_list, f)
安装jsonpath-ng库后,可像XPath一样查询JSON:
from jsonpath_ng import parse
data = {
"store": {
"book": [
{"title": "Python入门", "price": 39},
{"title": "算法导论", "price": 89}
]
}
}
jsonpath_expr = parse("$.store.book[*].title")
titles = [match.value for match in jsonpath_expr.find(data)]
print(titles) # 输出: ["Python入门", "算法导论"]
对于追求速度的场景,orjson库比标准库快3-5倍:
import orjson
data = {"key": "value"}
json_str = orjson.dumps(data).decode("utf-8")
print(json_str) # 输出: {"key":"value"}
json.dumps()/json.loads()处理字符串,json.dump()/json.load()操作文件。indent、sort_keys提升可读性,ensure_ascii=False保留中文。default和object_hook处理类实例、日期等非标准类型。JSONDecodeError和文件操作异常,增强程序健壮性。orjson等高性能库。Python的json模块以简洁的API覆盖了绝大多数JSON处理需求,结合参数配置与异常处理机制,既能满足快速开发需求,也能构建生产级可靠的应用。通过理解其核心原理与扩展技巧,开发者可更高效地完成数据交换任务。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。