这是一个非常核心的Python知识点。下面我将从核心区别详细参数实战示例以及其他模块(如pickle)的用法四个维度为你进行全面解析。


一、核心区别(先看这个)

简单来说,区别只在于“输出到哪里”

特性

json.dump()

json.dumps()

目标

文件对象 (File Object)

字符串 (String)

动作

序列化并直接写入文件

序列化并返回字符串

返回值

None

JSON格式的字符串

记忆法

dump to file

dump to string


二、详细用法与参数解析

两者都属于 json模块,用于将 Python 字典/列表等对象转换为 JSON 格式。

1. json.dumps()(Serialize to String)

功能:将 Python 对象转换成 JSON 字符串。

语法

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
           allow_nan=True, cls=None, indent=None, separators=None,
           default=None, sort_keys=False, **kw)

关键参数详解

  • indent(int): 缩进空格数,用于美化输出(Pretty Print)。

  • ensure_ascii(bool): 默认为 True。若为 False,则允许输出非ASCII字符(如中文),否则会转义为 \uXXXX

  • sort_keys(bool): 默认为 False。若为 True,输出的字典按键名排序。

  • separators(tuple): 去除多余空格,压缩JSON。例如 (',', ':')

示例

import json

data = {
    "name": "张三",
    "age": 28,
    "skills": ["Python", "Java"],
    "is_student": False
}

# 1. 基础用法
json_str = json.dumps(data)
print(json_str)
# 输出: {"name": "\u5f20\u4e09", "age": 28, "skills": ["Python", "Java"], "is_student": false}

# 2. 显示中文 + 美化输出
pretty_json = json.dumps(data, ensure_ascii=False, indent=4, sort_keys=True)
print(pretty_json)
# 输出:
# {
#     "age": 28,
#     "is_student": false,
#     "name": "张三",
#     "skills": [
#         "Python",
#         "Java"
#     ]
# }

# 3. 压缩JSON(用于网络传输)
compact_json = json.dumps(data, separators=(',', ':'))
print(compact_json)
# 输出: {"name":"张三","age":28,"skills":["Python","Java"],"is_student":false}
2. json.dump()(Serialize to File)

功能:将 Python 对象序列化并直接写入一个文件对象。

语法

json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True,
          allow_nan=True, cls=None, indent=None, separators=None,
          default=None, sort_keys=False, **kw)

参数含义与 dumps完全一致,只是第一个参数后多了一个文件指针 fp

示例

import json

data = {"project": "AI Assistant", "version": 1.0}

# 结合 with open 语句使用是最佳实践
with open('config.json', 'w', encoding='utf-8') as f:
    # 直接将 data 写入文件 f
    json.dump(data, f, ensure_ascii=False, indent=4)

# 此时文件 config.json 的内容已经是格式化好的 JSON

三、反序列化:loadloads

为了形成完整知识体系,必须提及对应的读取函数:

函数

作用

输入源

json.load()

从文件读取 JSON

文件对象

json.loads()

从字符串解析 JSON

字符串

# 接上面的 config.json 文件
with open('config.json', 'r', encoding='utf-8') as f:
    loaded_data = json.load(f)  # 从文件加载
    print(loaded_data['project'])  # 输出: AI Assistant

json_text = '{"city": "Beijing", "population": 2100}'
parsed_data = json.loads(json_text)  # 从字符串加载
print(parsed_data['city'])  # 输出: Beijing

四、扩展到 pickle模块(二进制序列化)

pickle是 Python 特有的序列化模块,规则一模一样:带 s 是字符串,不带 s 是文件

⚠️ 安全警告:永远不要 unpickle来自不信任来源的数据,这可能导致代码执行漏洞。

import pickle

data = {'list': [1, 2, 3], 'tuple': (4, 5)}

# 1. dumps -> bytes (注意是字节串,不是字符串)
byte_data = pickle.dumps(data)
print(byte_data)  # 输出类似 b'\x80\x04\x95...'

# 2. loads -> object
restored = pickle.loads(byte_data)
print(restored)  # {'list': [1, 2, 3], 'tuple': (4, 5)}

# 3. dump -> 文件
with open('data.pkl', 'wb') as f:  # 注意是 'wb' 二进制写入
    pickle.dump(data, f)

# 4. load -> 从文件恢复
with open('data.pkl', 'rb') as f:  # 注意是 'rb' 二进制读取
    restored_from_file = pickle.load(f)

五、如何选择?一张表总结

场景

推荐函数

原因

保存配置、数据到本地文件

json.dump()

直接落盘,代码简洁

通过网络发送数据 (API/WebSocket)

json.dumps()

需要字符串进行传输

缓存复杂 Python 对象 (含自定义类)

pickle.dumps()

JSON 无法序列化自定义对象

读取配置文件

json.load()

直接从文件流解析

解析接口返回的 JSON 文本

json.loads()

从接收到的字符串解析

终极记忆口诀

s 代表 String (字符串)

没有 s 代表 Stream/File (流/文件)

更多推荐