前排提示,并文由ai生成
json模块中的dump/dumps/load/loads是处理JSON数据的核心方法,它们的区别主要在于数据流向(内存 vs 文件)和数据类型(字符串 vs 二进制文件),以下是详细对比和使用场景:
一、核心区别表
| 方法 | 作用 | 输入类型 | 输出类型 | 适用场景 |
|---|---|---|---|---|
json.dump() |
将Python对象写入文件 | Python对象(dict/list等) | 无(直接写入文件) | 把JSON数据持久化到文件 |
json.dumps() |
将Python对象转为JSON字符串 | Python对象(dict/list等) | str(JSON字符串) | 内存中处理JSON(如缓存/网络传输) |
json.load() |
从文件读取JSON转为Python对象 | 文件对象(open()返回) | Python对象(dict/list等) | 从文件读取JSON数据 |
json.loads() |
将JSON字符串转为Python对象 | str/bytes(JSON格式) | Python对象(dict/list等) | 解析内存中的JSON字符串(如缓存读取/接口返回) |
二、详细说明与示例
1. json.dump():Python对象 → 文件
- 作用:直接将Python对象序列化为JSON格式并写入文件,无需先转字符串。
- 参数:需传入
Python对象和文件对象(必传),可选参数如ensure_ascii=False(支持中文)。 - 示例:
1 2 3 4data = {"name": "张三", "age": 20} # 写入文件 with open("data.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False) # 直接写入文件,无需转字符串
2. json.dumps():Python对象 → JSON字符串
- 作用:将Python对象序列化为JSON格式的字符串,用于内存操作(如缓存存储、接口返回)。
- 参数:仅需传入
Python对象,返回字符串。 - 示例(缓存存储场景):
1 2 3data = {"name": "张三", "age": 20} json_str = json.dumps(data, ensure_ascii=False) # → '{"name": "张三", "age": 20}' redis_client.set("user:1", json_str) # 存入Redis(字符串类型)
3. json.load():文件 → Python对象
- 作用:直接从JSON文件中读取数据并反序列化为Python对象。
- 参数:需传入
文件对象(必传)。 - 示例:
1 2 3# 从文件读取 with open("data.json", "r", encoding="utf-8") as f: data = json.load(f) # → {"name": "张三", "age": 20}(dict类型)
4. json.loads():JSON字符串 → Python对象
- 作用:将JSON格式的字符串/字节串反序列化为Python对象,用于解析内存中的JSON数据(如缓存读取、接口响应)。
- 参数:传入
JSON字符串或bytes(Redis返回的是bytes)。 - 示例(缓存读取场景):
1 2json_str = redis_client.get("user:1") # → b'{"name": "张三", "age": 20}'(bytes类型) data = json.loads(json_str) # → {"name": "张三", "age": 20}(dict类型)
三、常见错误与避坑
-
用
dump()代替dumps():
❌ 错误:redis_client.set(key, json.dump(data))(dump()需要文件对象,会报missing 'fp'错误)
✅ 正确:redis_client.set(key, json.dumps(data)) -
用
loads()读取文件:
❌ 错误:data = json.loads(open("data.json"))(loads()需字符串,不能传文件对象)
✅ 正确:data = json.load(open("data.json")) -
忽略编码问题:
写入文件时需指定encoding="utf-8",并设置ensure_ascii=False,否则中文会被转义为\uXXXX。
四、使用场景总结
- 文件操作:用
dump()(写)/load()(读) - 内存操作(缓存、网络传输):用
dumps()(序列化)/loads()(反序列化) - 你的缓存场景:
- 存缓存:
json.dumps(字典)→ 转字符串存入Redis - 读缓存:
json.loads(Redis返回的字符串/字节)→ 转回字典供接口返回
- 存缓存:
记住:带s的是处理字符串(string),不带s的是处理文件(file),就能轻松区分!