首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python中的json模块:从基础到进阶的实用指南

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

原创
作者头像
富贵软件
发布2025-10-20 11:27:49
发布2025-10-20 11:27:49
23100
代码可运行
举报
文章被收录于专栏:编程教程编程教程
运行总次数:0
代码可运行

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

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

一、JSON与Python的数据对话

1.1 为什么选择JSON?

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

代码语言:javascript
代码运行次数:0
运行
复制
{
  "name": "张三",
  "age": 28,
  "hobbies": ["阅读", "旅行"]
}

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

1.2 Python与JSON的天然契合

Python的字典(dict)和列表(list)与JSON结构高度相似。例如:

代码语言:javascript
代码运行次数:0
运行
复制
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字符串

代码语言:javascript
代码运行次数:0
运行
复制
import json

data = {"name": "李四", "score": 95}
json_str = json.dumps(data)
print(json_str)  # 输出: {"name": "李四", "score": 95}

场景2:从JSON字符串还原字典

代码语言:javascript
代码运行次数:0
运行
复制
json_str = '{"name": "王五", "score": 88}'
data = json.loads(json_str)
print(data["name"])  # 输出: 王五

场景3:写入JSON文件

代码语言:javascript
代码运行次数:0
运行
复制
data = {"product": "手机", "price": 2999}
with open("product.json", "w", encoding="utf-8") as f:
    json.dump(data, f)

场景4:读取JSON文件

代码语言:javascript
代码运行次数:0
运行
复制
with open("product.json", "r", encoding="utf-8") as f:
    data = json.load(f)
print(data["price"])  # 输出: 2999

三、参数配置:让JSON输出更优雅

3.1 格式化输出:indentseparators

默认生成的JSON字符串紧凑无换行,通过indent参数可实现层级缩进:

代码语言:javascript
代码运行次数:0
运行
复制
data = {"a": 1, "b": {"c": 2}}
pretty_json = json.dumps(data, indent=4)
print(pretty_json)

输出:

代码语言:javascript
代码运行次数:0
运行
复制
{
    "a": 1,
    "b": {
        "c": 2
    }
}

separators参数可自定义分隔符,去除多余空格:

代码语言:javascript
代码运行次数:0
运行
复制
compact_json = json.dumps(data, separators=(",", ":"))
print(compact_json) # 输出: {"a":1,"b":{"c":2}}

3.2 键排序:sort_keys

通过sort_keys=True按字母顺序排列键:

代码语言:javascript
代码运行次数:0
运行
复制
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码:

代码语言:javascript
代码运行次数:0
运行
复制
data = {"name": "张三"}
print(json.dumps(data)) # 输出: {"name": "\u5f20\u4e09"}

设置ensure_ascii=False保留原字符:

代码语言:javascript
代码运行次数:0
运行
复制
print(json.dumps(data, ensure_ascii=False)) # 输出: {"name": "张三"}

四、进阶应用:处理复杂数据类型

4.1 自定义对象序列化

Python类实例无法直接转为JSON,需通过default参数指定转换函数:

代码语言:javascript
代码运行次数:0
运行
复制
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字典还原为类实例:

代码语言:javascript
代码运行次数:0
运行
复制
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标准不支持日期类型,需手动转换为字符串:

代码语言:javascript
代码运行次数:0
运行
复制
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捕获异常:

代码语言:javascript
代码运行次数:0
运行
复制
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语句自动管理资源,并处理文件不存在等异常:

代码语言:javascript
代码运行次数:0
运行
复制
try:
    with open("nonexistent.json", "r") as f:
        data = json.load(f)
except FileNotFoundError:
    print("文件不存在")
except json.JSONDecodeError:
    print("文件内容非有效JSON")

六、性能优化:大数据量处理技巧

6.1 流式处理大文件

对于大型JSON文件,可使用ijson库逐项解析,避免内存溢出:

代码语言:javascript
代码运行次数:0
运行
复制
import ijson

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

6.2 批量写入优化

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

代码语言:javascript
代码运行次数:0
运行
复制
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与orjson

7.1 jsonpath:精准筛选嵌套数据

安装jsonpath-ng库后,可像XPath一样查询JSON:

代码语言:javascript
代码运行次数:0
运行
复制
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倍:

代码语言:javascript
代码运行次数:0
运行
复制
import orjson

data = {"key": "value"}
json_str = orjson.dumps(data).decode("utf-8")
print(json_str)  # 输出: {"key":"value"}

八、总结与最佳实践

  1. 基础场景:使用json.dumps()/json.loads()处理字符串,json.dump()/json.load()操作文件。
  2. 格式优化:通过indentsort_keys提升可读性,ensure_ascii=False保留中文。
  3. 复杂类型:自定义defaultobject_hook处理类实例、日期等非标准类型。
  4. 异常处理:捕获JSONDecodeError和文件操作异常,增强程序健壮性。
  5. 性能考量:大数据量时考虑流式处理或orjson等高性能库。

Python的json模块以简洁的API覆盖了绝大多数JSON处理需求,结合参数配置与异常处理机制,既能满足快速开发需求,也能构建生产级可靠的应用。通过理解其核心原理与扩展技巧,开发者可更高效地完成数据交换任务。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、JSON与Python的数据对话
    • 1.1 为什么选择JSON?
    • 1.2 Python与JSON的天然契合
  • 二、核心四函数:序列化与反序列化的基石
    • 2.1 基础操作示例
  • 三、参数配置:让JSON输出更优雅
    • 3.1 格式化输出:indent与separators
    • 3.2 键排序:sort_keys
    • 3.3 中文处理:ensure_ascii
  • 四、进阶应用:处理复杂数据类型
    • 4.1 自定义对象序列化
    • 4.2 自定义对象反序列化
    • 4.3 处理日期等特殊类型
  • 五、异常处理:构建健壮的JSON解析
    • 5.1 捕获无效JSON
    • 5.2 文件操作安全
  • 六、性能优化:大数据量处理技巧
    • 6.1 流式处理大文件
    • 6.2 批量写入优化
  • 七、第三方库扩展:jsonpath与orjson
    • 7.1 jsonpath:精准筛选嵌套数据
    • 7.2 orjson:高性能序列化
  • 八、总结与最佳实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档