You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中JSON的loads/dumps与Encoder/Decoder的差异解析

Python中json.loads/dumps与json.encoder/json.decoder的核心差异

1. 层级关系:高层封装 vs 底层核心

json.loads()/json.dumps()是Python JSON模块提供的高层快捷API,它们的内部实现完全依赖json.JSONEncoder和json.JSONDecoder这两个底层组件。你可以把前者理解为“一键调用的成品工具”,后者则是“组成工具的核心零件”。

2. 易用性与适用场景

高层API(loads/dumps)

  • 专为常规JSON编解码设计,开箱即用,无需关注底层逻辑
  • 直接处理Python基础类型(dict、list、str、int、float等)与JSON格式的互转,覆盖90%以上的日常需求
  • 示例:
    import json
    # 常规编码
    json_str = json.dumps({"name": "Bob", "age": 25})
    # 常规解码
    data = json.loads(json_str)
    

底层组件(encoder/decoder)

  • 用于定制化编解码场景,当默认的loads/dumps无法满足需求时才需要用到
  • 你需要继承JSONEncoder或JSONDecoder,重写特定方法来实现自定义逻辑,比如处理自定义类、datetime、Decimal等特殊类型
  • 示例(自定义日期编码器):
    import json
    from datetime import datetime
    
    class DateTimeEncoder(json.JSONEncoder):
        def default(self, obj):
            if isinstance(obj, datetime):
                return obj.isoformat()
            # 交给父类处理其他未知类型
            return super().default(obj)
    
    # 用自定义编码器处理datetime对象
    event = {"time": datetime.now(), "name": "birthday"}
    json_str = json.dumps(event, cls=DateTimeEncoder)
    

3. 灵活性对比

  • loads/dumps仅能通过有限参数(比如default、object_hook、indent等)做简单定制,无法完全控制编解码流程
  • encoder/decoder允许你重写核心方法(比如JSONEncoder.default()、JSONDecoder.decode()),实现完全自定义的编解码逻辑,比如严格控制JSON字段的排序、过滤敏感数据、自定义JSON结构等

4. 调用逻辑的本质

  • 当你调用json.dumps(data)时,内部会自动创建一个JSONEncoder的默认实例,调用它的encode()方法完成编码
  • 当你调用json.loads(json_str)时,内部会自动创建一个JSONDecoder的默认实例,调用它的decode()方法完成解码
  • 如果你通过cls参数指定了自定义的Encoder/Decoder类,loads/dumps就会使用你定义的类实例来执行操作

内容的提问来源于stack exchange,提问作者simmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:20:27