Python中的json模块:从基础到进阶的实用指南

简介: 本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)

​免费python编程教程:https://pan.quark.cn/s/2c17aed36b72

在数据驱动的编程世界中,JSON(JavaScript Object Notation)已成为跨平台数据交换的标准格式。Python通过内置的json模块,为开发者提供了简洁高效的工具集,无需安装第三方库即可完成JSON数据的序列化与反序列化。本文将以通俗易懂的方式,结合实际案例,深入解析json模块的核心功能、参数配置及进阶用法。
探秘代理IP并发连接数限制的那点事 - 2025-10-20T112405.898.png

一、JSON与Python的数据对话
1.1 为什么选择JSON?
JSON以键值对(Key-Value)为核心结构,支持嵌套对象和数组,具有轻量级、易读写的特点。例如,一个用户信息可以表示为:

{
"name": "张三",
"age": 28,
"hobbies": ["阅读", "旅行"]
}

这种格式既适合人类阅读,也能被大多数编程语言快速解析,成为API接口、配置文件的首选格式。

1.2 Python与JSON的天然契合
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等
2.1 基础操作示例
场景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

三、参数配置:让JSON输出更优雅
3.1 格式化输出: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}}

3.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}

3.3 中文处理:ensure_ascii
默认将非ASCII字符(如中文)转义为Unicode码:

data = {"name": "张三"}
print(json.dumps(data)) # 输出: {"name": "\u5f20\u4e09"}

设置ensure_ascii=False保留原字符:

print(json.dumps(data, ensure_ascii=False)) # 输出: {"name": "张三"}

四、进阶应用:处理复杂数据类型
4.1 自定义对象序列化
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}

4.2 自定义对象反序列化
通过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) # 输出: 钱七

4.3 处理日期等特殊类型
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解析
5.1 捕获无效JSON
解析时可能遇到格式错误的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

5.2 文件操作安全
读写文件时建议使用with语句自动管理资源,并处理文件不存在等异常:

try:
with open("nonexistent.json", "r") as f:
data = json.load(f)
except FileNotFoundError:
print("文件不存在")
except json.JSONDecodeError:
print("文件内容非有效JSON")

六、性能优化:大数据量处理技巧
6.1 流式处理大文件
对于大型JSON文件,可使用ijson库逐项解析,避免内存溢出:

import ijson

with open("large_data.json", "r") as f:
for item in ijson.items(f, "item"):
print(item) # 逐项处理

6.2 批量写入优化
写入大量数据时,可先构建完整字典再一次性写入:

datalist = [{"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与orjson
7.1 jsonpath:精准筛选嵌套数据
安装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入门", "算法导论"]

7.2 orjson:高性能序列化
对于追求速度的场景,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处理需求,结合参数配置与异常处理机制,既能满足快速开发需求,也能构建生产级可靠的应用。通过理解其核心原理与扩展技巧,开发者可更高效地完成数据交换任务。

目录
相关文章
|
21天前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
203 7
|
1月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
186 0
|
28天前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
1月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
4月前
|
JSON API 数据格式
Python采集京东商品评论API接口示例,json数据返回
下面是一个使用Python采集京东商品评论的完整示例,包括API请求、JSON数据解析
|
4月前
|
存储 JSON API
Python与JSON:结构化数据的存储艺术
Python字典与JSON格式结合,为数据持久化提供了便捷方式。通过json模块,可轻松实现数据序列化与反序列化,支持跨平台数据交换。适用于配置管理、API通信等场景,兼具可读性与高效性,是Python开发中不可或缺的数据处理工具。
164 0
|
22天前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
181 0
|
23天前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
121 0
|
2月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
2月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
104 4
下一篇