主页
文章
分类
标签
关于
python中json的一些注意事项
发布于: 2025-4-8   更新于: 2025-4-8   收录于: Python , Json
文章字数: 1563   阅读时间: 4 分钟   阅读量:

前排提示,并文由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
    4
    
    data = {"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
    3
    
    data = {"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
    2
    
    json_str = redis_client.get("user:1")  # → b'{"name": "张三", "age": 20}'(bytes类型)
    data = json.loads(json_str)  # → {"name": "张三", "age": 20}(dict类型)
    

三、常见错误与避坑

  1. dump()代替dumps()
    ❌ 错误:redis_client.set(key, json.dump(data))dump()需要文件对象,会报missing 'fp'错误)
    ✅ 正确:redis_client.set(key, json.dumps(data))

  2. loads()读取文件
    ❌ 错误:data = json.loads(open("data.json"))loads()需字符串,不能传文件对象)
    ✅ 正确:data = json.load(open("data.json"))

  3. 忽略编码问题
    写入文件时需指定encoding="utf-8",并设置ensure_ascii=False,否则中文会被转义为\uXXXX

四、使用场景总结

  • 文件操作:用dump()(写)/load()(读)
  • 内存操作(缓存、网络传输):用dumps()(序列化)/loads()(反序列化)
  • 你的缓存场景
    • 存缓存:json.dumps(字典) → 转字符串存入Redis
    • 读缓存:json.loads(Redis返回的字符串/字节) → 转回字典供接口返回

记住:s的是处理字符串(string),不带s的是处理文件(file),就能轻松区分!