Python3 json 模块及应用

🎉摘要:什么是 JSON 格式?JSON 对象数组语法怎么写?一文带你学会 Python json 模块操作,包含 Python 对象与 JSON 互转、读写 JSON 文件、格式化美化 JSON,附完整可运行代码示例和综合项目实战。

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 模块

在 Python 中,为了便捷操作 json 数据,提供了一个专门的模块 json。使用该模块,可以便捷、快速的将 Python 对象转换为 JSON 字符串,或 JSON 字符串转换为 Python 对象。你还可以将 JSON 数据写入到文件,或者从文件读取 JSON 数据,直接转换为 Python 对象。

注意,python 和 JSON 进行互相转换,有必要看看它们之间的类型对应关系,如下表:

Python 类型JSON 类型
dictobject
list, tuplearray
strstring
int, floatnumber
Truetrue
Falsefalse
Nonenull

常用方法

学习 json 模块,我们不需要掌握所有方法,只需掌握下面四个方法,就可以了:

dumps()

直接将 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
}

loads()

该方法是 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'>
姓名: 张三
爱好: ['篮球', '编程']

dump()

除了将 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"
}

load()

假如你需要加载 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'>
系统名称: 学生管理系统

扩展功能

json.JSONEncoder(自定义对象序列化)

默认情况下,不支持把 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 文件来存储学生信息,主要功能如下:

  1. 添加学生信息,学生信息保存到 students.json 文件

  2. 读 students.json 文件,并展示所有学生信息

  3. 支持中文、格式化、异常处理

完整代码:

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 文档。

 

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号