一、什么是JSON?
JSON(JavaScript Object Notation)是一种基于文本的开放标准,用于表示结构化数据。它采用键值对的形式组织数据,支持以下基本数据类型:
- 字符串(string)
- 数字(number)
- 布尔值(true / false)
- 空值(null)
- 对象(object,即键值对集合)
- 数组(array,即有序列表)
例如,一个简单的 JSON 数据如下:
{
"name": "张三",
"age": 25,
"is_student": true,
"hobbies": ["读书", "游泳"],
"address": null
}
二、Python中的json模块
Python 的标准库 json 提供了将 Python 对象序列化为 JSON 字符串,以及将 JSON 字符串反序列化为 Python 对象的功能。该模块无需安装,直接导入即可使用:
python
import json
主要函数
| 函数 | 功能 |
|---|---|
json.dumps(obj) |
将 Python 对象转换为 JSON 字符串 |
json.loads(s) |
将 JSON 字符串解析为 Python 对象 |
json.dump(obj, file) |
将 Python 对象写入文件(以 JSON 格式) |
json.load(file) |
从文件读取 JSON 数据并解析为 Python 对象 |
三、数据类型映射关系
Python 与 JSON 在数据类型上存在一定的映射关系:
| Python 类型 | JSON 类型 |
|---|---|
dict |
object |
list, tuple |
array |
str |
string |
int, float |
number |
True |
true |
False |
false |
None |
null |
注意:Python 中的
tuple会被转换为 JSON 的array,但反向解析时会变成list。
四、基本用法示例
1. 序列化:Python对象 → JSON字符串(dumps)
python
import json
data = {
"name": "李四",
"age": 30,
"is_employee": True,
"skills": ["Python", "Django", "Flask"],
"address": None
}
# 转换为JSON字符串
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)
输出结果:
{
"name": "李四",
"age": 30,
"is_employee": true,
"skills": [
"Python",
"Django",
"Flask"
],
"address": null
}
参数说明:
ensure_ascii=False:允许非ASCII字符(如中文)正常显示,否则会转义。indent=2:美化输出,使用2个空格缩进,便于阅读。
2. 反序列化:JSON字符串 → Python对象(loads)
python
json_string = '''
{
"title": "Python入门教程",
"pages": 256,
"available": true,
"tags": ["编程", "学习"]
}
'''
data = json.loads(json_string)
print(type(data)) # <class 'dict'>
print(data['title']) # Python入门教程
3. 写入JSON文件(dump)
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
这会将 data 对象写入名为 data.json 的文件中,并以 UTF-8 编码保存,支持中文。
4. 读取JSON文件(load)
python
with open('data.json', 'r', encoding='utf-8') as f:
loaded_data = json.load(f)
print(loaded_data)
五、常见问题与注意事项
1. 处理中文乱码
默认情况下,json.dumps() 会将非 ASCII 字符转义(如 \u4e2d\u6587),需设置 ensure_ascii=False 才能正确显示中文。
2. 自定义对象无法直接序列化
Python 中自定义类的对象不能直接被 json 序列化。例如:
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("王五", 28)
# json.dumps(p) # 报错:Object of type Person is not JSON serializable
解决方法:提供自定义的序列化函数或继承 JSONEncoder。
方法一:使用 default 参数
python
def person_serializer(obj):
if isinstance(obj, Person):
return {'name': obj.name, 'age': obj.age}
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
json_str = json.dumps(p, default=person_serializer, ensure_ascii=False, indent=2)
print(json_str)
方法二:自定义 JSONEncoder
python
class PersonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {'name': obj.name, 'age': obj.age}
return super().default(obj)
json_str = json.dumps(p, cls=PersonEncoder, ensure_ascii=False, indent=2)
print(json_str)
六、实际应用场景
-
API 接口通信
Web 开发中,客户端与服务器常通过 JSON 传输数据。Python 后端可使用
json模块解析请求体或构造响应内容。 -
配置文件存储
使用
.json文件保存程序配置,如数据库连接信息、用户偏好设置等。 -
日志记录与数据导出
将结构化数据以 JSON 格式保存,便于后续分析或迁移。
-
跨语言数据交换
JSON 是语言无关的格式,Python 生成的 JSON 可被 JavaScript、Java、Go 等语言解析。
七、性能建议
- 对于大量数据操作,避免频繁调用
dumps/loads,可考虑批量处理。 - 若需更高性能,可使用第三方库如
ujson或orjson(非标准库,但兼容性好)。
总结
Python 的 json 模块是一个功能强大且简单易用的标准库,能够高效地完成 JSON 数据的序列化与反序列化。掌握其基本用法对于从事 Web 开发、数据处理或自动化脚本编写的开发者来说至关重要。
通过本文的学习,你应该已经掌握了:
- 如何使用
dumps和loads进行字符串级别的转换; - 如何使用
dump和load操作 JSON 文件; - 如何处理中文、美化输出;
- 如何扩展支持自定义对象;
- 了解常见的使用场景与最佳实践。
📌 参考文档
Python 官方文档 - json 模块