pin_drop当前位置:知识文库 ❯ 图文

Python json模块详解 - 序列化与解码入门教程

一、概述

json 是 Python 标准库中处理 JSON(JavaScript Object Notation)数据的核心模块。JSON 是一种轻量级的数据交换格式,广泛应用于 Web API、配置文件、数据存储等场景。json 模块提供了将 Python 对象序列化为 JSON 字符串(编码)和将 JSON 字符串反序列化为 Python 对象(解码)的完整功能,是前后端数据交互和跨语言数据交换的基础工具。


二、语法

代码示例

import json

# 编码:Python对象 -> JSON字符串
json_str = json.dumps(obj)

# 解码:JSON字符串 -> Python对象
obj = json.loads(json_str)

# 编码到文件
json.dump(obj, file)

# 从文件解码
obj = json.load(file)

三、参数说明

json 模块的核心函数概览:

函数 说明 输入 输出
json.dumps() 编码为JSON字符串 Python对象 str
json.loads() 从字符串解码 str Python对象
json.dump() 编码并写入文件 Python对象+文件 None
json.load() 从文件读取并解码 文件 Python对象

Python 与 JSON 类型映射:

Python类型 JSON类型
dict object {}
list, tuple array []
str string
int, float number
True true
False false
None null

四、返回值

  • dumps():返回 JSON 格式的 str

  • loads():返回 Python 对象(dict、list、str、int、float、bool、None)

  • dump():无返回值(None),将 JSON 写入文件

  • load():返回从文件解析的 Python 对象


五、代码示例

示例1:基本编码与解码

代码示例

import json

# Python 对象
data = {
    "name": "张三",
    "age": 25,
    "scores": [85, 92, 78],
    "is_student": True,
    "address": None,
}

# 编码为 JSON 字符串
json_str = json.dumps(data, ensure_ascii=False)
print(f"类型: {type(json_str).__name__}")
print(f"JSON: {json_str}")

# 解码为 Python 对象
parsed = json.loads(json_str)
print(f"\n类型: {type(parsed).__name__}")
print(f"姓名: {parsed['name']}")
print(f"成绩: {parsed['scores']}")

输出:

代码示例

类型: str
JSON: {"name": "张三", "age": 25, "scores": [85, 92, 78], "is_student": true, "address": null}

类型: dict
姓名: 张三
成绩: [85, 92, 78]

示例2:文件读写操作

代码示例

import json

data = {
    "users": [
        {"id": 1, "name": "张三", "role": "admin"},
        {"id": 2, "name": "李四", "role": "user"},
    ],
    "total": 2,
}

# 写入 JSON 文件
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)
print("已写入 data.json")

# 读取 JSON 文件
with open("data.json", "r", encoding="utf-8") as f:
    loaded = json.load(f)

print(f"用户数: {loaded['total']}")
for user in loaded["users"]:
    print(f"  {user['id']}. {user['name']} ({user['role']})")

输出:

代码示例

已写入 data.json
用户数: 2
  1. 张三 (admin)
  2. 李四 (user)

示例3:格式化输出与类型验证

代码示例

import json

data = {"name": "Python", "version": 3.11, "features": ["简单", "强大", "优雅"]}

# 不同格式化选项
print("紧凑格式:")
print(json.dumps(data, ensure_ascii=False, separators=(',', ':')))

print("\n缩进格式:")
print(json.dumps(data, ensure_ascii=False, indent=2))

print("\n排序键:")
print(json.dumps(data, ensure_ascii=False, sort_keys=True, indent=2))

# 类型映射验证
json_str = '{"name": "test", "active": true, "count": 0, "data": null}'
parsed = json.loads(json_str)

print("\n类型映射:")
for key, value in parsed.items():
    print(f"  {key}: {value} -> {type(value).__name__}")

输出:

代码示例

紧凑格式:
{"name":"Python","version":3.11,"features":["简单","强大","优雅"]}

缩进格式:
{
  "name": "Python",
  "version": 3.11,
  "features": [
    "简单",
    "强大",
    "优雅"
  ]
}

排序键:
{
  "features": [
    "简单",
    "强大",
    "优雅"
  ],
  "name": "Python",
  "version": 3.11
}

类型映射:
  name: test -> str
  active: True -> bool
  count: 0 -> int
  data: None -> NoneType

六、实际应用场景

  • Web API 开发:处理 HTTP 请求和响应中的 JSON 数据,是 RESTful API 的标准数据格式

  • 配置文件管理:使用 JSON 格式存储应用配置,支持嵌套结构和注释替代方案

  • 数据持久化:将 Python 对象序列化为 JSON 文件,实现简单的数据存储和交换


七、注意事项

注意1json.dumps() 默认将非 ASCII 字符转义为 \uXXXX。处理中文时应设置 ensure_ascii=False,否则中文会变成 Unicode 转义序列。

注意2:JSON 不支持 Python 的 set、tuple(转为数组)、bytes、datetime 等类型,需要自定义编码器或预先转换。

注意3:JSON 的键必须是字符串,Python dict 的非字符串键会被自动转换为字符串。

提示:对于复杂的序列化需求(如自定义对象、日期时间等),可以通过继承 json.JSONEncoder 实现自定义编码器。


八、相关方法对比

特性 json模块 pickle模块 yaml库 toml库
数据格式 JSON 二进制 YAML TOML
跨语言 否(Python专属)
安全性 安全 不安全(代码执行) 安全 安全
可读性 不可读 非常高
支持类型 基本类型 所有Python对象 基本类型+日期 基本类型
安装要求 标准库 标准库 需安装 需安装(3.11前)

九、小结

  • json 模块是 Python 处理 JSON 数据的标准方案,提供编码(dumps/dump)和解码(loads/load)四项核心功能

  • Python 与 JSON 的类型映射清晰明确,基本类型可直接转换

  • 处理中文时务必设置 ensure_ascii=False,格式化输出使用 indent 参数

  • JSON 不支持所有 Python 类型,复杂对象需自定义编码器或预先转换


十、练习题

练习1

编写一个函数,将包含中文的字典序列化为格式化的 JSON 字符串,并验证反序列化后数据一致。

练习2

编写一个配置文件管理类,支持从 JSON 文件加载配置、修改配置项、保存配置到文件。

练习3

对比 jsonpickle 模块的区别,编写代码演示它们在序列化 set、自定义类实例时的不同行为。

小贴士

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,由 Douglas Crockford 在 2000 年代初提出。它基于 JavaScript 的对象字面量语法,但独立于语言,几乎所有现代编程语言都有 JSON 解析库。相比 XML,JSON 更简洁、解析更快,已成为 Web API 的事实标准。Python 从 2.6 版本起将 json 模块纳入标准库,底层由 C 实现,性能优异。

常见问题

json.dumps() 和 json.dump() 有什么区别?

dumps() 返回 JSON 格式的字符串,适用于网络传输和调试;dump() 直接将 JSON 写入文件对象,适用于数据持久化,更节省内存。

为什么处理中文时要设置 ensure_ascii=False?

默认 ensure_ascii=True 会将中文等非 ASCII 字符转义为 \uXXXX 格式的 Unicode 转义序列,设置 ensure_ascii=False 可以让中文字符原样输出,提高可读性。

JSON 能序列化 Python 的 set 和 tuple 吗?

set 不能直接序列化,需要先转为 list;tuple 会被转为 JSON 的 array(数组)类型。对于不支持的类型,可以使用 default 参数自定义序列化逻辑。

json 和 pickle 模块的主要区别是什么?

json 生成人类可读的文本格式,支持跨语言交换,安全性高;pickle 生成二进制格式,仅适用于 Python,支持所有 Python 对象但存在安全风险(可执行恶意代码)。

标签: json模块 序列化 JSON 数据交换 Python标准库 dumps loads

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python strptime详解 - 字符串解析为日期时间的完整指南 下一篇: Python json.dumps详解 - 序列化参数与格式化技巧

poll相关推荐