
这是一个非常核心的Python知识点。下面我将从核心区别、详细参数、实战示例以及其他模块如pickle的用法四个维度为你进行全面解析。一、核心区别先看这个简单来说区别只在于“输出到哪里”特性json.dump()json.dumps()目标文件对象 (File Object)字符串 (String)动作序列化并直接写入文件序列化并返回字符串返回值NoneJSON格式的字符串记忆法dump to filedump to string二、详细用法与参数解析两者都属于json模块用于将 Python 字典/列表等对象转换为 JSON 格式。1.json.dumps()(Serialize to String)功能将 Python 对象转换成 JSON 字符串。语法json.dumps(obj, *, skipkeysFalse, ensure_asciiTrue, check_circularTrue, allow_nanTrue, clsNone, indentNone, separatorsNone, defaultNone, sort_keysFalse, **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_asciiFalse, indent4, sort_keysTrue) 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, *, skipkeysFalse, ensure_asciiTrue, check_circularTrue, allow_nanTrue, clsNone, indentNone, separatorsNone, defaultNone, sort_keysFalse, **kw)参数含义与dumps完全一致只是第一个参数后多了一个文件指针fp。示例import json data {project: AI Assistant, version: 1.0} # 结合 with open 语句使用是最佳实践 with open(config.json, w, encodingutf-8) as f: # 直接将 data 写入文件 f json.dump(data, f, ensure_asciiFalse, indent4) # 此时文件 config.json 的内容已经是格式化好的 JSON三、反序列化load与loads为了形成完整知识体系必须提及对应的读取函数函数作用输入源json.load()从文件读取 JSON文件对象json.loads()从字符串解析 JSON字符串# 接上面的 config.json 文件 with open(config.json, r, encodingutf-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 (流/文件)