Python与JSON的完美邂逅:从读取到解析,一篇搞定
在当今的互联网世界,JSON(JavaScript Object Notation)已经成为数据交换的事实标准,它轻量、易读、易于解析,无论是从API获取数据,还是读取配置文件,我们都离不开它,作为Python开发者,如何“看”(即读取和解析)JSON数据是一项必备技能,本文将带你从零开始,轻松玩转Python中的JSON操作。
什么是JSON?为什么我们要用它?
在开始之前,我们先简单了解一下JSON,你可以把它想象成一种专门用来存储和传输数据的“文本格式”,长得像Python中的字典和列表。
一个典型的JSON数据长这样:
{
"name": "张三",
"age": 30,
"isStudent": false,
"courses": [
{"title": "Python入门", "credits": 3},
{"title": "数据结构", "credits": 4}
],
"address": null
}
它由键值对组成,值可以是字符串、数字、布尔值、数组(对应Python的列表)、对象(对应Python的字典)或null(对应Python的None)。
Python之所以要“看”JSON,是因为Python代码无法直接理解这种文本格式的数据,我们需要一个“翻译官”,将JSON文本转换成Python能直接操作的数据结构(主要是字典和列表),这个“翻译官”就是Python内置的 json 模块。
Python的“翻译官”:json模块
Python内置了强大的 json 模块,它提供了非常简单易用的函数,让我们在Python对象和JSON字符串之间进行无缝转换。
- 编码(序列化):将Python对象(如字典、列表)转换成JSON字符串,这个过程也叫 序列化。
- 解码(反序列化):将JSON字符串转换成Python对象,这个过程也叫 解析 或 反序列化。
我们今天主要关注的是“解码”,也就是“看”JSON数据。
核心操作:如何“看”JSON数据?
假设我们有一个JSON格式的字符串,存储在Python变量 json_string 中。
json_string = '''
{
"name": "李四",
"skills": ["Python", "JavaScript", "SQL"],
"contact": {
"email": "lisi@example.com",
"phone": "13800138000"
}
}
'''
我们想“看”懂它,有以下几个关键步骤和函数:
json.loads() —— 从字符串到Python对象
这是最核心、最常用的函数。loads 是 load strings(从字符串加载)的缩写,它的作用就是把我们上面那个多行字符串 json_string,转换成一个Python对象。
import json
# 1. 准备JSON字符串
json_string = '''
{
"name": "李四",
"skills": ["Python", "JavaScript", "SQL"],
"contact": {
"email": "lisi@example.com",
"phone": "13800138000"
}
}
'''
# 2. 使用json.loads()进行解析
python_data = json.loads(json_string)
# 3. 现在就可以像操作普通Python对象一样“看”数据了
print("解析后的数据类型:", type(python_data))
print("姓名:", python_data['name'])
print("技能列表:", python_data['skills'])
print("邮箱:", python_data['contact']['email'])
输出结果:
解析后的数据类型: <class 'dict'>
姓名: 李四
技能列表: ['Python', 'JavaScript', 'SQL']
邮箱: lisi@example.com
看到了吗?json.loads() 成功地将JSON字符串转换为了一个Python字典,之后,你就可以用熟悉的字典和列表操作方式来访问和修改数据了。
json.load() —— 从文件到Python对象
在实际开发中,JSON数据更多是存储在 .json 文件里的,这时,我们就需要 json.load() 函数(注意,没有 s),它用于从一个文件对象中读取并解析JSON数据。
假设我们有一个名为 data.json 的文件,内容如下:
data.json 文件内容:
{
"company": "梦想科技有限公司",
"location": "北京",
"employees": [
{"id": 1, "name": "王五", "role": "工程师"},
{"id": 2, "name": "赵六", "role": "设计师"}
]
}
在Python中读取这个文件的代码如下:
import json
# 使用 with 语句打开文件,它会自动处理文件的关闭
with open('data.json', 'r', encoding='utf-8') as f:
# 使用 json.load() 从文件对象f中加载数据
file_data = json.load(f)
# 现在可以操作file_data了
print("公司名称:", file_data['company'])
print("第一位员工:", file_data['employees'][0]['name'])
输出结果:
公司名称: 梦想科技有限公司
第一位员工: 王五
json.load() 和 json.loads() 的功能本质是一样的,只是数据来源不同:一个来自文件流,一个来自字符串。
常见问题与“容错”处理
我们拿到的JSON数据可能并不完美,比如字符串里包含了非法的字符,或者文件编码不对,这时直接解析会抛出 json.JSONDecodeError 异常,一个好的做法是使用 try-except 结构来捕获错误。
import json
bad_json_string = "{'name': '错误', 'city': '北京'}" # 注意,这里用了单引号,这是无效的JSON
try:
data = json.loads(bad_json_string)
except json.JSONDecodeError as e:
print(f"解析JSON时发生错误: {e}")
print("请检查JSON格式是否正确(必须使用双引号)。")
输出结果:
解析JSON时发生错误: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
请检查JSON格式是否正确(必须使用双引号)。
通过这种方式,你的程序会更加健壮,不会因为一个格式错误的小问题而崩溃。
“看完”之后:如何把Python对象变回JSON?
学会了“看”,顺便了解一下如何“说”,也就是将Python对象转换回JSON字符串,这对应 json 模块的另外两个函数:
json.dumps():将Python对象序列化为JSON字符串(dumps -> dump strings)。json.dump():将Python对象序列化并写入文件(dump -> dump to file)。
示例:json.dumps()
import json
python_dict = {
"user": "Charlie",
"scores": [95, 88, 92]
}
# 将Python字典转换为JSON字符串
json_output = json.dumps(python_dict, ensure_ascii=False, indent=4)
print(json_output)
输出结果(格式化后的JSON字符串):
{
"user": "Charlie",
"scores": [
95,
88,
92
]
}
ensure_ascii=False:确保中文字符能正常显示,而不是被转义成\u格式。indent=4:让输出的JSON字符串格式化,缩进4个空格,便于阅读。
示例:json.dump()
如果要把数据写入一个 .json 文件:
import json
data_to_save = {
"project": "数据分析报告",
"version": "1.0",
"status": "完成"
}
with open('output.json', 'w', encoding='utf-8') as f:
# 将Python对象写入文件
json.dump(data_to_save, f, ensure_ascii=False, indent=4)
print("数据已成功保存到 output.json 文件。")
运行后,会生成一个格式清晰的 output.json 文件。
通过本文的学习,你应该已经了Python“看”JSON的核心方法:
| 你的目标 | 使用函数 | 说明 |
|---|---|---|
| 解析JSON字符串 | json.loads() |
将JSON文本字符串 -> Python字典/列表 |
| 解析JSON文件 | json.load() |
从文件中读取JSON -> Python字典/列表 |
| 生成JSON字符串 | json.dumps() |
将Python字典/列表 -> JSON文本字符串 |
| 生成JSON文件 | json.dump() |
将Python字典/列表 -> 写入JSON文件 |
json 模块这个强大的工具,它就像一座桥梁,连接了Python世界和JSON数据世界,无论是处理API响应,还是管理配置文件,你都能游刃有余!



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