Python怎么读取和生成JSON文件:从基础到实践的全面指南
在当今数据驱动的开发环境中,JSON(JavaScript Object Notation)作为一种轻量级、易读的数据交换格式,已成为各编程语言间数据交互的“通用语言”,无论是Web API的响应、配置文件的存储,还是跨系统数据传输,JSON都凭借其简洁性和灵活性被广泛应用,Python作为一门功能强大的编程语言,内置了对JSON的完美支持,通过json
模块即可轻松实现JSON数据的读取与生成,本文将详细介绍Python中操作JSON文件的核心方法,并结合实际场景提供代码示例,帮助开发者快速这一实用技能。
Python读取JSON文件:从文件到字典/列表
读取JSON文件的核心任务是将文件中的JSON格式数据转换为Python中的原生数据类型(如字典dict
、列表list
等),以便后续处理,Python内置的json
模块提供了load()
和loads()
两个关键函数,分别用于从文件流读取和从字符串解析JSON数据。
使用json.load()
读取JSON文件
json.load()
函数需要一个“文件流对象”作为参数,该对象需以文本模式('r'
)打开JSON文件,基本步骤如下:
(1)准备JSON文件
假设我们有一个名为data.json
的文件,内容如下:
{ "name": "张三", "age": 25, "is_student": false, "courses": ["Python", "JavaScript", "SQL"], "address": { "city": "北京", "district": "海淀区" } }
(2)编写Python代码读取
import json # 以只读文本模式打开JSON文件 with open('data.json', 'r', encoding='utf-8') as file: data = json.load(file) # 将JSON文件内容转换为Python字典 # 打印读取的数据 print(data) print(f"姓名: {data['name']}") print(f"课程: {data['courses']}") print(f"城市: {data['address']['city']}")
输出结果:
{'name': '张三', 'age': 25, 'is_student': False, 'courses': ['Python', 'JavaScript', 'SQL'], 'address': {'city': '北京', 'district': '海淀区'}}
姓名: 张三
课程: ['Python', 'JavaScript', 'SQL']
城市: 北京
关键点:
- 文件必须以文本模式(
'r'
)打开,确保json.load()
能正确解析字符编码(推荐使用encoding='utf-8'
避免中文乱码)。 with
语句能自动管理文件资源,避免忘记关闭文件导致的错误。- JSON中的数据类型会自动转换为Python对应类型:JSON对象→
dict
、JSON数组→list
、JSON字符串→str
、JSON数字→int
/float
、JSON布尔值→bool
、JSON null→None
。
使用json.loads()
从字符串解析JSON
如果JSON数据已经以字符串形式存在(例如从API响应或用户输入中获取),可以使用json.loads()
(注意多了一个s
,代表“string”)进行解析:
import json json_str = ''' { "name": "李四", "age": 30, "hobbies": ["阅读", "旅行"] } ''' # 从字符串解析JSON data = json.loads(json_str) print(data) print(f"年龄: {data['age']}") print(f"爱好: {data['hobbies'][0]}")
输出结果:
{'name': '李四', 'age': 30, 'hobbies': ['阅读', '旅行']}
年龄: 30
爱好: 阅读
Python生成JSON文件:从字典/列表到文件
生成JSON文件的核心任务是将Python中的原生数据类型(如字典dict
、列表list
等)转换为JSON格式字符串,并写入文件。json
模块提供了dump()
和dumps()
两个关键函数,分别用于写入文件流和生成字符串。
使用json.dump()
生成JSON文件
json.dump()
函数需要两个核心参数:Python对象(如字典、列表)和文件流对象(以文本写入模式'w'
打开),基本步骤如下:
(1)准备Python数据
import json data = { "name": "王五", "age": 28, "is_teacher": True, "subjects": ["数学", "物理"], "contact": { "email": "wangwu@example.com", "phone": "13800138000" } }
(2)将数据写入JSON文件
# 以写入文本模式打开文件(若文件不存在则创建,存在则覆盖) with open('output.json', 'w', encoding='utf-8') as file: json.dump(data, file, ensure_ascii=False, indent=4) print("JSON文件生成成功!")
执行后,会生成output.json
如下(格式化后):
{ "name": "王五", "age": 28, "is_teacher": true, "subjects": [ "数学", "物理" ], "contact": { "email": "wangwu@example.com", "phone": "13800138000" } }
关键参数说明:
ensure_ascii=False
:默认情况下,json.dump()
会将非ASCII字符(如中文)转义为\u
编码,设置ensure_ascii=False
可保留原始字符,确保中文正常显示。indent=4
:指定缩进空格数,使JSON文件格式化(易读),若省略则输出为一行(紧凑格式)。
使用json.dumps()
生成JSON字符串
如果只需要将Python对象转换为JSON格式字符串(不写入文件),可以使用json.dumps()
(s
代表“string”):
import json data = { "product": "笔记本电脑", "price": 5999, "in_stock": True } # 生成JSON字符串 json_str = json.dumps(data, ensure_ascii=False, indent=2) print("生成的JSON字符串:") print(json_str)
输出结果:
生成的JSON字符串:
{
"product": "笔记本电脑",
"price": 5999,
"in_stock": true
}
常见问题与解决方案
在实际操作中,开发者可能会遇到一些问题,以下是典型场景及解决方法:
中文显示为Unicode编码(如\u4e2d\u6587
)
问题:未设置ensure_ascii=False
,导致非ASCII字符被转义。
解决:在json.dump()
或json.dumps()
中添加ensure_ascii=False
参数(如前文示例所示)。
文件写入后中文乱码
问题:文件打开模式未指定编码(如默认使用系统编码),或编码与JSON数据编码不一致。
解决:始终以encoding='utf-8'
模式打开文件,确保编码统一。
处理复杂数据类型(如datetime
、自定义对象)
JSON标准仅支持基本数据类型(字符串、数字、布尔值、null、对象、数组),Python中的datetime
、自定义类等复杂类型无法直接序列化,此时需要通过default
参数自定义序列化逻辑:
import json from datetime import datetime class User: def __init__(self, name, join_date): self.name = name self.join_date = join_date # datetime类型 # 自定义序列化函数 def serialize_user(obj): if isinstance(obj, User): return { "name": obj.name, "join_date": obj.join_date.isoformat() # 转换为ISO格式字符串 } raise TypeError(f"Object of type {type(obj)} is not JSON serializable") user = User("赵六", datetime(2023, 1, 1)) # 使用default参数指定自定义序列化函数 json_str = json.dumps(user, default=serialize_user, ensure_ascii=False, indent=2) print(json_str)
输出结果:
{ "name": "赵六", "join_date": "2023-01-01T00:00:00" }
JSON文件格式错误导致解析失败
问题:JSON文件中存在语法错误(如缺少逗号、引号不匹配),json.load()
会抛出json.JSONDecodeError
。
解决:使用try-except
捕获异常,并提示用户检查文件格式:
import json try: with open('invalid.json', 'r', encoding='utf-8') as file: data = json.load(file) except json.JSONDecodeError as e: print(f"JSON文件格式错误: {e}") except
还没有评论,来说两句吧...