Python JSON模块详解:全方位指南

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,Python 通过 json 模块提供了 JSON 数据的编码和解码功能。

1. 核心函数概览

函数 描述 常用场景
json.load() 从文件读取并解析 JSON 数据 读取 JSON 文件
json.loads() 从字符串解析 JSON 数据 处理 API 响应
json.dump() 将 Python 对象写入 JSON 文件 数据持久化
json.dumps() 将 Python 对象转为 JSON 字符串 网络传输

2. JSON 解码(读取/解析)

2.1 json.load()

从文件对象读取 JSON 数据并解码为 Python 对象。

语法:

python

复制

json.load(fp, *, cls=None, object_hook=None, parse_float=None, 
          parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

示例:

python

复制

import json

with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

参数说明:

  • fp: 文件对象(必须可读)

  • object_hook: 自定义字典解码函数

  • parse_float: 自定义浮点数解码

  • parse_int: 自定义整数解码

  • 2.2 json.loads()

    从字符串解析 JSON 数据。

    语法:

    python

    复制

    json.loads(s, *, cls=None, object_hook=None, parse_float=None, 
               parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

    示例:

    python

    复制

    json_str = '{"name": "John", "age": 30}'
    data = json.loads(json_str)

    3. JSON 编码(写入/序列化)

    3.1 json.dump()

    将 Python 对象编码为 JSON 并写入文件。

    语法:

    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)

    示例:

    python

    复制

    data = {"name": "张三", "age": 25}
    
    with open('output.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

    3.2 json.dumps()

    将 Python 对象编码为 JSON 字符串。

    语法:

    python

    复制

    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)

    示例:

    python

    复制

    data = {"name": "李四", "scores": [95, 88, 92]}
    json_str = json.dumps(data, indent=2, ensure_ascii=False)

    4. 高级功能

    4.1 自定义编码器(JSONEncoder)

    处理无法默认序列化的对象。

    示例:

    python

    复制

    from datetime import datetime
    import json
    
    class CustomEncoder(json.JSONEncoder):
        def default(self, obj):
            if isinstance(obj, datetime):
                return obj.isoformat()
            return super().default(obj)
    
    data = {"event": "会议", "time": datetime.now()}
    json_str = json.dumps(data, cls=CustomEncoder)

    4.2 自定义解码器

    示例:

    python

    复制

    def datetime_decoder(dct):
        if 'time' in dct:
            try:
                dct['time'] = datetime.fromisoformat(dct['time'])
            except (ValueError, KeyError):
                pass
        return dct
    
    json_str = '{"event": "会议", "time": "2023-07-20T14:30:00"}'
    data = json.loads(json_str, object_hook=datetime_decoder)

    5. 参数详解

    5.1 常用参数

    参数 描述 默认值
    ensure_ascii 是否转义非ASCII字符 True
    indent 缩进空格数(美化输出) None
    sort_keys 是否按键排序 False
    separators 指定分隔符 (',', ':')

    5.2 安全相关参数

    参数 描述
    allow_nan 是否允许NaN等特殊浮点值
    check_circular 是否检查循环引用

    6. 异常处理

    异常 描述
    json.JSONDecodeError JSON解析错误
    TypeError 无法序列化的对象
    ValueError 循环引用等值错误

    处理示例:

    python

    复制

    try:
        data = json.loads(invalid_json_str)
    except json.JSONDecodeError as e:
        print(f"JSON解析错误: {e}")

    7. 最佳实践

    1. 文件操作始终使用上下文管理器

      python

      复制

      with open('data.json') as f:
          data = json.load(f)
    2. 处理非ASCII内容

      python

      复制

      json.dumps(data, ensure_ascii=False)
    3. 性能考虑

    4. 大文件使用 ijson 等流式解析库

    5. 生产环境考虑紧凑格式(indent=None

    6. 安全性

    7. 不要解析不受信任的JSON数据

    8. 考虑使用 json.JSONDecoder 的严格模式

    8. 完整示例

    python

    复制

    import json
    from datetime import datetime
    
    # 自定义编码器
    class CustomEncoder(json.JSONEncoder):
        def default(self, obj):
            if isinstance(obj, datetime):
                return obj.isoformat()
            return super().default(obj)
    
    # 编码示例
    data = {
        "name": "王五",
        "age": 28,
        "register_date": datetime.now(),
        "skills": ["Python", "SQL"]
    }
    
    # 序列化为字符串
    json_str = json.dumps(data, cls=CustomEncoder, ensure_ascii=False, indent=2)
    print("JSON字符串:")
    print(json_str)
    
    # 写入文件
    with open('user.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, cls=CustomEncoder, ensure_ascii=False)
    
    # 从文件读取
    with open('user.json', 'r', encoding='utf-8') as f:
        loaded_data = json.load(f)
        print("\n从文件加载的数据:")
        print(loaded_data)

    9. 总结对比表

    操作 文件 字符串
    编码 json.dump() json.dumps()
    解码 json.load() json.loads()

    通过掌握这些函数和技巧,您可以高效地在Python中处理各种JSON数据交换场景。

    作者:叫醒你笛莎

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python JSON模块详解:全方位指南

    发表回复