Python怎么用json文件:从基础到实践的全面指南
在Python开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其可读性强、易于解析和生成,被广泛应用于配置文件存储、API数据交互、数据持久化等场景,Python内置了json模块,让我们能高效地读写JSON文件,本文将从基础概念出发,详细介绍Python操作JSON文件的完整流程,包括读取、写入、处理复杂数据及常见问题解决。
JSON与Python的数据类型映射
在操作JSON文件前,需明确JSON格式与Python数据类型的对应关系,这是正确解析和生成数据的基础:
| JSON格式类型 | Python类型 | 说明 |
|---|---|---|
| object | dict (字典) | 键值对集合,键必须是字符串 |
| array | list (列表) / tuple (元组) | 有序序列 |
| string | str (字符串) | 文本数据 |
| number | int (整数) / float (浮点数) | 数值类型 |
| true/false | True / False | 布尔值 |
| null | None | 空值 |
读取JSON文件:json.load()与json.loads()
读取JSON文件是常见操作,Python的json模块提供了两种核心方法:json.load()(从文件对象读取)和json.loads()(从字符串解析)。
从文件读取JSON:json.load()
假设有一个名为config.json的配置文件,内容如下:
{
"app_name": "数据可视化工具",
"version": "1.2.0",
"features": ["图表生成", "数据导出", "实时更新"],
"settings": {
"theme": "dark",
"language": "zh_CN",
"max_items": 100
},
"is_beta": false
}
使用json.load()读取该文件的代码如下:
import json
# 打开JSON文件(推荐使用with语句,自动管理文件资源)
with open('config.json', 'r', encoding='utf-8') as file:
data = json.load(file) # 从文件对象解析JSON数据为Python对象
# 解析后的data是Python字典,可直接操作
print(f"应用名称: {data['app_name']}")
print(f"功能列表: {data['features']}")
print(f"设置信息: {data['settings']}")
说明:
open()中的encoding='utf-8'是推荐设置,避免中文等非ASCII字符乱码。with语句能确保文件在操作完成后自动关闭,即使发生异常也不会导致资源泄漏。
从字符串解析JSON:json.loads()
如果JSON数据以字符串形式存在(例如从API响应或用户输入获取),可用json.loads()解析:
json_str = '{"name": "张三", "age": 25, "hobbies": ["阅读", "编程"]}'
data = json.loads(json_str) # 解析为Python字典
print(f"姓名: {data['name']}")
print(f"爱好: {data['hobbies'][0]}")
写入JSON文件:json.dump()与json.dumps()
将Python对象保存为JSON文件时,需使用json.dump()(写入文件对象)和json.dumps()(转换为字符串)。
将Python对象写入文件:json.dump()
假设要将一个Python字典保存为JSON文件:
import json
data = {
"project": "机器学习项目",
"team": ["Alice", "Bob", "Charlie"],
"parameters": {
"learning_rate": 0.01,
"epochs": 100
},
"status": "进行中"
}
# 写入JSON文件
with open('project.json', 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4) # 格式化写入
说明:
ensure_ascii=False:允许非ASCII字符(如中文)直接写入,避免转义为\u格式。indent=4:指定缩进为4个空格,使JSON文件格式化,可读性更强(若省略,JSON会以紧凑格式写入,无换行和缩进)。
将Python对象转换为字符串:json.dumps()
如果需要将JSON数据作为字符串使用(例如嵌入HTTP请求或打印到控制台):
data = {"name": "李四", "scores": [88, 92, 76]}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print("JSON字符串:")
print(json_str)
输出:
{
"name": "李四",
"scores": [
88,
92,
76
]
}
处理复杂数据:自定义编码与解码
当Python对象包含datetime、自定义类等JSON不直接支持的数据类型时,直接使用json.dump()会报错(如TypeError: Object of type datetime is not JSON serializable),此时需通过default参数自定义编码函数,或通过object_hook参数自定义解码函数。
自定义编码:处理datetime等类型
假设数据包含datetime对象,需将其转换为字符串:
import json
from datetime import datetime
data = {
"event": "会议",
"time": datetime.now(), # datetime对象
"participants": ["张三", "李四"]
}
# 自定义编码函数
def datetime_encoder(obj):
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S") # 转换为字符串
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
# 写入文件,使用default参数指定编码函数
with open('event.json', 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4, default=datetime_encoder)
输出event.json:
{
"event": "会议",
"time": "2023-10-01 14:30:00",
"participants": [
"张三",
"李四"
]
}
自定义解码:还原自定义类对象
如果JSON文件中存储了自定义类的实例信息(如{"class": "User", "name": "王五", "age": 30}),需在读取时还原为类对象:
import json
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"User(name='{self.name}', age={self.age})"
# 自定义解码函数
def user_decoder(dct):
if dct.get("__class__") == "User":
return User(name=dct["name"], age=dct["age"])
return dct
# 假设JSON文件内容为:{"__class__": "User", "name": "王五", "age": 30}
json_str = '{"__class__": "User", "name": "王五", "age": 30}'
user = json.loads(json_str, object_hook=user_decoder)
print(user) # 输出: User(name='王五', age=30)
print(type(user)) # 输出: <class '__main__.User'>
常见问题与解决方案
中文乱码问题
现象:写入JSON文件后,中文显示为\u转义字符(如"name": "\u4e2d\u6587")。
解决:在json.dump()或json.dumps()中设置ensure_ascii=False。
文件不存在或权限错误
现象:open()文件时抛出FileNotFoundError或PermissionError。
解决:
-
检查文件路径是否正确(推荐使用
os.path模块处理路径)。 -
确保程序对文件有读写权限(如Linux/macOS下的
chmod命令)。 -
使用
try-except捕获异常并处理:import json import os file_path = "data.json" if not os.path.exists(file_path): print(f"文件 {file_path} 不存在,将创建新文件") try: with open(file_path, 'r', encoding='utf-8') as file: data = json.load(file) except FileNotFoundError: data = {} # 初始化空字典 except PermissionError: print("无权限访问文件,请检查权限") exit()
JSON格式错误
现象:json.load()或json.loads()抛出json.JSONDecodeError,通常因JSON字符串



还没有评论,来说两句吧...