使用 Python 处理 JSON 数据
Python中处理JSON数据的实用指南
一、开篇:JSON与Python的“那些事儿”
如果你经常跟API打交道,或者需要把数据保存到文件里,那你八成会遇到JSON这种数据格式。它就像不同编程语言之间的“通用语言”,简单、易读,还特别轻量。
Python自带的json模块,就是专门为处理JSON数据而生的。它让你能轻松地把Python里的字典、列表等数据类型,转换成JSON格式的字符串或文件;反过来,也能把JSON数据还原成Python能直接操作的对象。
本文就带你一步步掌握Python中处理JSON的核心技巧,包括读写文件、格式化输出、以及数据类型的注意事项。读完你就能在日常工作中熟练运用JSON了。
一句话总结:JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换格式。Python的
json模块是处理它的“瑞士军刀”。
二、JSON语法速览:跟Python字典有点像,但要注意几个“坑”
JSON的语法看起来很像Python的字典和列表,但细节上有一些关键区别。
一个典型的JSON示例
下面是一个描述狗狗信息的JSON对象:
{
"name": "旺财",
"isDog": true,
"hobbies": ["吃", "睡", "汪汪叫"],
"age": 3,
"address": {
"work": null,
"home": ["北京市", "朝阳区"]
}
}
JSON与Python的主要区别(新手易错点)
| 特性 | JSON | Python |
|---|---|---|
| 字符串引号 | 只能用双引号 " " |
单引号、双引号都行 |
| 布尔值 | true / false(小写) |
True / False(首字母大写) |
| 空值 | null |
None |
| 注释 | 不支持 | 支持 # 或 """ |
| 尾随逗号 | 不允许 | 允许(字典、列表末尾可加逗号) |
提醒:如果你在JSON里用了单引号、加了注释、或者多了一个尾随逗号,解析时就会报错。这是新手最常踩的三个坑。
三、Python写入JSON:把数据变成JSON格式
1. 把Python字典转成JSON字符串:json.dumps()
import json
# 一个普通的Python字典
dog_rating = {"狗粮": 8, "肉干": 10, "蔬菜": 3}
# 转换成JSON字符串
json_str = json.dumps(dog_rating)
print(json_str)
# 输出:{"dog_food": 8, "meat": 10, "vegetable": 3}
注意:字典里的数字键会被自动转成字符串,因为JSON的键必须是字符串。
data = {1: "苹果", 2: "香蕉"}
print(json.dumps(data)) # 输出:{"1": "苹果", "2": "香蕉"}
2. 把Python数据写入JSON文件:json.dump()
如果你想保存到文件,用json.dump()(没有s):
import json
dog_data = {
"name": "旺财",
"age": 3,
"hobbies": ["吃", "睡"]
}
with open("dog.json", "w", encoding="utf-8") as f:
json.dump(dog_data, f, indent=4, ensure_ascii=False)
参数说明:
indent=4:让输出的JSON有缩进,更易读(这就是“美化”)。ensure_ascii=False:允许输出中文,否则中文会变成\uxxxx形式。
四、Python读取JSON:把JSON数据变回Python对象
1. 从JSON字符串解析:json.loads()
import json
json_str = '{"name": "旺财", "age": 3}'
python_dict = json.loads(json_str)
print(python_dict["name"]) # 输出:旺财
2. 从JSON文件读取:json.load()
import json
with open("dog.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data["hobbies"]) # 输出:['吃', '睡']
五、类型对照表:Python <-> JSON 转换规则
| Python 类型 | 转成 JSON | JSON 类型 | 转回 Python |
|---|---|---|---|
dict |
object |
object |
dict |
list, tuple |
array |
array |
list |
str |
string |
string |
str |
int, float |
number |
number |
int / float |
True |
true |
true |
True |
False |
false |
false |
False |
None |
null |
null |
None |
⚠️ 重要陷阱:元组会变成列表
original = {"home": ("北京", "上海")}
json_str = json.dumps(original)
restored = json.loads(json_str)
print(type(restored["home"])) # <class 'list'> 元组没了!
这是因为JSON的array没有“元组”的概念,只能转成Python的列表。如果你需要保持元组,需要自己额外处理。
六、实用技巧:让JSON更易读或更紧凑
1. 美化输出(Pretty Print)
在dumps或dump时加上indent参数:
print(json.dumps({"name": "旺财", "age": 3}, indent=2))
输出:
{
"name": "旺财",
"age": 3
}
2. 压缩输出(Minify)
去掉多余的空格,节省空间(适合网络传输):
# 设置 separators 去掉冒号和逗号后面的空格
mini = json.dumps(data, separators=(",", ":"))
3. 终端中验证和美化JSON文件
Python提供了一个命令行工具json.tool,可以直接在终端使用:
# 验证并美化显示
python -m json.tool messy.json
# 压缩(去掉所有空白)
python -m json.tool pretty.json compact.json --compact
七、动手示例:一个完整的“宠物信息管理”小例子
import json
# 模拟从API获取的原始JSON字符串
raw_json = '''
[
{"name": "旺财", "type": "dog", "age": 3},
{"name": "咪咪", "type": "cat", "age": 2}
]
'''
# 解析为Python列表
pets = json.loads(raw_json)
# 添加一只新宠物
pets.append({"name": "啾啾", "type": "bird", "age": 1})
# 保存到文件(美化格式)
with open("pets.json", "w", encoding="utf-8") as f:
json.dump(pets, f, indent=2, ensure_ascii=False)
print("保存完成!")
# 读取回来验证
with open("pets.json", "r", encoding="utf-8") as f:
loaded_pets = json.load(f)
for pet in loaded_pets:
print(f"{pet['name']} - {pet['type']} - {pet['age']}岁")
八、常见问题速查
Q:JSON键可以是数字吗?
A:JSON标准要求键是字符串。Python的json.dumps()会自动把数字键转成字符串。
Q:怎么让dumps()不把中文转成\uXXXX?
A:加上参数ensure_ascii=False。
Q:解析出错怎么办?
A:检查是不是用了单引号、注释、或者尾随逗号。可以用json.tool在终端先验证一下。
Q:能直接转换自定义的Python对象吗?
A:可以,但需要继承JSONEncoder类并实现default()方法。一般场景下,先把对象转成字典再处理更简单。
总结
- 核心模块:
json(无需额外安装) - 四个核心函数:
json.dumps():Python对象 → JSON字符串json.dump():Python对象 → JSON文件json.loads():JSON字符串 → Python对象json.load():JSON文件 → Python对象
- 注意数据类型差异:布尔值大小写、空值、元组变列表
- 两个实用技巧:
indent美化、separators压缩 - 命令行工具:
python -m json.tool验证和格式化
掌握了这些,你就能在Python项目中轻松应对各种JSON处理需求了。
更多推荐



所有评论(0)