JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式。它便于人类阅读和编写,也易于机器解析与生成。我们日常开发 Retful 接口,绝大多数都是使用 JSON 作为数据格式,因为解析方便。后端返回 JSON 格式,前端直接可以转为 JavaScript 对象,访问不要太方便。
下面就是一个简单的 JSON 格式的数据:
{
"studentId": 2026001,
"studentName": "张三",
"gender": "男",
"age": 19,
"height": 175.5,
"isMarried": false,
"isStudent": true,
"graduateSchool": null,
"address": {
"province": "四川省",
"city": "成都市",
"district": "成华区",
"detail": "XX大学1号宿舍楼302室"
},
"hobbies": ["篮球", "编程", "阅读", "旅游"],
"scores": [
{
"subject": "语文",
"score": 92.5,
"pass": true
},
{
"subject": "数学",
"score": 88.0,
"pass": true
},
{
"subject": "英语",
"score": 55.0,
"pass": false
}
],
"createTime": "2026-04-30 14:30:25"
}上面示例中,[] 表示数组,{} 表示一个对象,一个对象中可以存放多个键值对("key": "value"),同时,JSON 支持字符串、布尔值、数字等基础类型。注意:{} 和 [] 可以嵌套使用,形成非常复杂的数据结构。
关于更多 JSON 格式的语法信息,可以参考 https://www.json.org/json-en.html 文档。
在 Python 中,为了便捷操作 json 数据,提供了一个专门的模块 json。使用该模块,可以便捷、快速的将 Python 对象转换为 JSON 字符串,或 JSON 字符串转换为 Python 对象。你还可以将 JSON 数据写入到文件,或者从文件读取 JSON 数据,直接转换为 Python 对象。
注意,python 和 JSON 进行互相转换,有必要看看它们之间的类型对应关系,如下表:
| Python 类型 | JSON 类型 |
| dict | object |
| list, tuple | array |
| str | string |
| int, float | number |
| True | true |
| False | false |
| None | null |
学习 json 模块,我们不需要掌握所有方法,只需掌握下面四个方法,就可以了:
直接将 Python 对象转换为一个 JSON 字符串,此时 JSON 字符串存在内存中。
方法支持的参数:
indent:缩进格式化输出(美化 JSON)
ensure_ascii=False:支持中文(必须加,否则中文会乱码)
sort_keys=True:按键排序
例如:
import json
# 定义 Python 数据
data = {
"name": "张三",
"age": 20,
"is_student": True,
"hobbies": ["篮球", "编程"],
"score": None
}
# 转换为 JSON 字符串
json_str = json.dumps(data, ensure_ascii=False, indent=4)
print("JSON 字符串类型:", type(json_str))
print("格式化 JSON:\n", json_str)运行结果:
JSON 字符串类型: <class 'str'>
格式化 JSON:
{
"name": "张三",
"age": 20,
"is_student": true,
"hobbies": [
"篮球",
"编程"
],
"score": null
}该方法是 dumps() 方法的逆操作,将 JSON 字符串转换为 Python 对象,例如:
import json
# JSON 字符串
json_str = '''
{
"name": "张三",
"age": 20,
"is_student": true,
"hobbies": ["篮球", "编程"],
"score": null
}
'''
# 转为 Python 字典
data = json.loads(json_str)
print("Python 对象类型:", type(data))
print("姓名:", data["name"])
print("爱好:", data["hobbies"])运行结果:
Python 对象类型: <class 'dict'>
姓名: 张三
爱好: ['篮球', '编程']除了将 Python 对象转换为 JSON 字符串外,我们可能希望将转换后的字符串存储到文件中,你可以先使用 dumps() 然后使用 with open 方式将内容写入到文件。
如果不想这样做,json 模块提供了 dump() 方法,可以直接将 JSON 字符串写入到文件。例如:
import json
data = {
"app_name": "学生管理系统",
"version": "1.0",
"admin": "admin"
}
# 写入文件
with open("config.json", "w", encoding="utf-8") as f:
# ensure_ascii=False 保存中文不乱码,indent 格式化
json.dump(data, f, ensure_ascii=False, indent=4)
print("config.json 写入完成!")运行后会生成 config.json 文件,内容如下:
{
"app_name": "学生管理系统",
"version": "1.0",
"admin": "admin"
}假如你需要加载 config.json 配置文件,里面配置了应用需要使用的配置信息。可以先使用 with open 将文件的数据读取到内存,然后使用 loads 进行解析。为了操作更加便捷,json 模块提供了 load() 方法,直接将文件内容提取出来,自动转换成 Python 对象。例如:
import json
# 读取 JSON 文件
with open("config.json", "r", encoding="utf-8") as f:
data = json.load(f)
print("读取成功,类型:", type(data))
print("系统名称:", data["app_name"])运行结果:
读取成功,类型: <class 'dict'>
系统名称: 学生管理系统默认情况下,不支持把 Python 的类实例转换位 JSON,需要自定义。我们可以借助 json.JSONEncoder 实现自定义序列化,例如:
import json
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
# 自定义编码器
class MyEncoder(json.JSONEncoder):
def default(self, obj):
return obj.__dict__ # 把对象属性转字典
stu = Student("李四", 22)
json_str = json.dumps(stu, cls=MyEncoder, ensure_ascii=False)
print(json_str) # {"name":"李四","age":22}运行结果:
{"name": "李四", "age": 22}假如我们要编写一个简单的学生信息管理软件,不想使用数据库(或者还没有学习数据库相关知识),可以采用 JSON 文件来保存学生数据。
下面示例将演示如何使用 JSON 文件来存储学生信息,主要功能如下:
添加学生信息,学生信息保存到 students.json 文件
读 students.json 文件,并展示所有学生信息
支持中文、格式化、异常处理
完整代码:
import json
import os
# 文件名
FILE_NAME = "students.json"
def init_file():
"""初始化 JSON 文件(不存在则创建空列表)"""
if not os.path.exists(FILE_NAME):
with open(FILE_NAME, "w", encoding="utf-8") as f:
json.dump([], f, ensure_ascii=False, indent=4)
def add_student(name, age, gender, score):
"""添加学生信息并保存到文件"""
# 读取现有数据
with open(FILE_NAME, "r", encoding="utf-8") as f:
students = json.load(f)
# 新学生信息
new_stu = {
"name": name,
"age": age,
"gender": gender,
"score": score
}
students.append(new_stu) # 添加到列表末尾
# 写入文件
with open(FILE_NAME, "w", encoding="utf-8") as f:
json.dump(students, f, ensure_ascii=False, indent=4)
print(f"学生 {name} 添加成功!")
def show_all_students():
"""展示所有学生"""
with open(FILE_NAME, "r", encoding="utf-8") as f:
students = json.load(f)
print("\n学生列表:")
for i, stu in enumerate(students, 1):
print(f"{i}. 姓名:{stu['name']},年龄:{stu['age']},性别:{stu['gender']},分数:{stu['score']}")
if __name__ == "__main__":
# 初始化
init_file()
# 添加学生
add_student("张三", 20, "男", 95)
add_student("李四", 19, "女", 88)
add_student("王五", 21, "男", 92)
# 显示所有学生
show_all_students()运行结果:
学生 张三 添加成功!
学生 李四 添加成功!
学生 王五 添加成功!
学生列表:
1. 姓名:张三,年龄:20,性别:男,分数:95
2. 姓名:李四,年龄:19,性别:女,分数:88
3. 姓名:王五,年龄:21,性别:男,分数:92注意,如果出现中文乱码,则必须添加 ensure_ascii=False,文件读写必须指定 encoding="utf-8"。
更多关于 json 模块的内容,请参考 https://docs.python.org/3/library/json.html 文档。