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

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

目录

一、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:高性能序列化

八、总结与最佳实践


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

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

一、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 格式化输出:indentseparators

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

data = {"a": 1, "b": {"c": 2}}
pretty_json = json.dumps(data, indent=4)
print(pretty_json)

输出:

{
    "a": 1,
    "b": {
        "c": 2
    }
}

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

***pact_json = json.dumps(data, separators=(",", ":"))
print(***pact_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 批量写入优化

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

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:

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"}

八、总结与最佳实践

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

转载请说明出处内容投诉
CSS教程网 » Python中的json模块:从基础到进阶的实用指南

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买