将Python数据类转换为JSON的三种方法

Written by

in

文章目录
  • 这是官方推荐的基础方案,通过dataclasses.asdict()将数据类实例转为字典,再用json.dumps()序列化,适合简单的非嵌套数据类。 import json from dataclasses import dataclass, asdict # 定义你的数据类(贴合数据服务场景:比如电商数据接口的返回数据) @dataclass class EcommerceData: order_id: str # 订单ID user_id: int # 用户ID amount: float # 订单金额 is_paid: bool # 是否支付 # 创建数据类实例 data_instance = EcommerceData( order_id=”ORD20260113001″, user_id=10086, amount=299.99, is_paid=True ) # 优雅转换为JSON # 步骤1:转字典 → 步骤2:序列化为JSON字符串(ensure_ascii=False支持中文,indent美化格式) json_str = json.dumps(asdict(data_instance), ensure_ascii=False, indent=2) # 输出结果 print(json_str) 输出结果: { “order_id”: “ORD20260113001”, “user_id”: 10086, “amount”: 299.99, “is_paid”: true } 关键解释: asdict(data_instance):将 dataclass 实例转为嵌套字典(支持嵌套 dataclass); json.dumps()的indent=2让 JSON 格式更优雅,ensure_ascii=False避免中文被转义(数据服务中常处理中文数据)。
  • 如果需要多次序列化 dataclass,自定义JSONEncoder子类是更优雅的方式,无需每次手动调用asdict()。 import json from dataclasses import dataclass, is_dataclass, asdict # 自定义JSON编码器(自动识别dataclass并转换) class DataClassJSONEncoder(json.JSONEncoder): def default(self, obj): # 如果是dataclass实例,自动转字典 if is_dataclass(obj): return asdict(obj) # 其他类型沿用默认序列化逻辑 return super().default(obj) # 定义数据类(嵌套场景,更贴近真实数据服务) @dataclass class UserInfo: name: str phone: str @dataclass class OrderData: order_id: str user: UserInfo # 嵌套dataclass total: float # 创建嵌套数据实例 nested_data = OrderData( order_id=”ORD20260113002″, user=UserInfo(name=”张三”, phone=”13800138000″), total=599.0 ) # 直接序列化(指定自定义编码器,无需手动转字典) json_str = json.dumps( nested_data, cls=DataClassJSONEncoder, # 核心:指定自定义编码器 ensure_ascii=False, indent=2 ) print(json_str) 输出结果: { “order_id”: “ORD20260113002”, “user”: { “name”: “张三”, “phone”: “13800138000” }, “total”: 599.0 } 关键解释: 重写JSONEncoder的default方法,自动识别 dataclass 实例并转换; 支持嵌套 dataclass,更贴合数据服务中复杂数据结构的场景; 一次定义,多处复用,代码更简洁优雅。
  • 作为数据服务商,推荐使用pydantic库(数据校验 + JSON 序列化一体化),它的dataclass不仅支持一键转 JSON,还能自动校验数据类型,避免脏数据,是生产环境的首选。
  • 核心思路:Python dataclass 转 JSON 的关键是先将实例转为可序列化的字典(或 pydantic 结构化数据),再进行 JSON 序列化; 场景选择:简单场景用asdict()+json.dumps,复用场景用自定义JSONEncoder,生产环境优先用pydantic(兼顾校验和序列化); 数据服务适配:pydantic方案不仅优雅,还能校验数据合法性,是数据服务商处理接口返回、数据传输的最优选择。 以上就是将Python数据类转换为JSON的三种方法的详细内容,更多关于Python数据类转换为JSON的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: 将Python数据类优雅地转换为JSON的方法详解 Python中数据类转换为JSON的方法详解 Python xml、字典、json、类四种数据类型如何实现互相转换
  • 目录
    • 方法 1:基础优雅方案(dataclasses.asdict + json.dumps)
    • 方法 2:复用性更强的方案(自定义 JSON 编码器)
    • 方法 3:生产级优雅方案(使用 pydantic,推荐)
      • 步骤 1:安装 pydantic
      • 步骤 2:代码实现
    • 总结

      文章介绍在 Python 中把数据类(dataclass)以优雅、规范的方式转换成 JSON 格式的方法,这是数据处理场景中非常实用的需求,尤其贴合你作为数据服务商的技术工作场景。

      Python 内置的json模块默认无法直接序列化dataclass实例,下面我会提供三种从基础到进阶的优雅方案,覆盖简单场景、复用场景和生产级场景,代码可直接复制使用。

      这是官方推荐的基础方案,通过dataclasses.asdict()将数据类实例转为字典,再用json.dumps()序列化,适合简单的非嵌套数据类。

      import json
      from dataclasses import dataclass, asdict
       
      # 定义你的数据类(贴合数据服务场景:比如电商数据接口的返回数据)
      @dataclass
      class EcommerceData:
          order_id: str          # 订单ID
          user_id: int           # 用户ID
          amount: float          # 订单金额
          is_paid: bool          # 是否支付
       
      # 创建数据类实例
      data_instance = EcommerceData(
          order_id="ORD20260113001",
          user_id=10086,
          amount=299.99,
          is_paid=True
      )
       
      # 优雅转换为JSON
      # 步骤1:转字典 → 步骤2:序列化为JSON字符串(ensure_ascii=False支持中文,indent美化格式)
      json_str = json.dumps(asdict(data_instance), ensure_ascii=False, indent=2)
       
      # 输出结果
      print(json_str)

      输出结果

      {
        "order_id": "ORD20260113001",
        "user_id": 10086,
        "amount": 299.99,
        "is_paid": true
      }

      关键解释

      • asdict(data_instance):将 dataclass 实例转为嵌套字典(支持嵌套 dataclass);
      • json.dumps()indent=2让 JSON 格式更优雅,ensure_ascii=False避免中文被转义(数据服务中常处理中文数据)。

      如果需要多次序列化 dataclass,自定义JSONEncoder子类是更优雅的方式,无需每次手动调用asdict()

      import json
      from dataclasses import dataclass, is_dataclass, asdict
       
      # 自定义JSON编码器(自动识别dataclass并转换)
      class DataClassJSONEncoder(json.JSONEncoder):
          def default(self, obj):
              # 如果是dataclass实例,自动转字典
              if is_dataclass(obj):
                  return asdict(obj)
              # 其他类型沿用默认序列化逻辑
              return super().default(obj)
       
      # 定义数据类(嵌套场景,更贴近真实数据服务)
      @dataclass
      class UserInfo:
          name: str
          phone: str
       
      @dataclass
      class OrderData:
          order_id: str
          user: UserInfo  # 嵌套dataclass
          total: float
       
      # 创建嵌套数据实例
      nested_data = OrderData(
          order_id="ORD20260113002",
          user=UserInfo(name="张三", phone="13800138000"),
          total=599.0
      )
       
      # 直接序列化(指定自定义编码器,无需手动转字典)
      json_str = json.dumps(
          nested_data,
          cls=DataClassJSONEncoder,  # 核心:指定自定义编码器
          ensure_ascii=False,
          indent=2
      )
       
      print(json_str)

      输出结果

      {
        "order_id": "ORD20260113002",
        "user": {
          "name": "张三",
          "phone": "13800138000"
        },
        "total": 599.0
      }

      关键解释

      • 重写JSONEncoderdefault方法,自动识别 dataclass 实例并转换;
      • 支持嵌套 dataclass,更贴合数据服务中复杂数据结构的场景;
      • 一次定义,多处复用,代码更简洁优雅。

      作为数据服务商,推荐使用pydantic库(数据校验 + JSON 序列化一体化),它的dataclass不仅支持一键转 JSON,还能自动校验数据类型,避免脏数据,是生产环境的首选。

      pip install pydantic 

      from pydantic.dataclasses import dataclass  # 注意:是pydantic的dataclass
       
      # 定义带数据校验的dataclass(数据服务核心需求:数据合法性)
      @dataclass
      class DataServiceResponse:
          code: int               # 状态码(必须是int)
          msg: str                # 提示信息(必须是str)
          data: dict              # 业务数据(必须是dict)
          timestamp: float = 0.0  # 时间戳(可选,默认0.0)
       
      # 创建实例
      response = DataServiceResponse(
          code=200,
          msg="请求成功",
          data={"order_count": 100, "total_amount": 29999.5},
          timestamp=1736764800.0
      )
       
      # 一键优雅转JSON(无需额外处理,自带格式化)
      json_str = response.model_dump_json(indent=2, ensure_ascii=False)
       
      print(json_str)

      输出结果

      {
        "code": 200,
        "msg": "请求成功",
        "data": {
          "order_count": 100,
          "total_amount": 29999.5
        },
        "timestamp": 1736764800.0
      }

      关键解释

      • pydantic.dataclass:自带数据类型校验(比如传入code="200"会直接报错,避免数据类型错误);
      • model_dump_json():一键序列化,无需手动转字典,支持嵌套、默认值、中文等;
      • 贴合数据服务商的核心需求:数据校验 + JSON 序列化一体化,减少冗余代码。

      1. 核心思路:Python dataclass 转 JSON 的关键是先将实例转为可序列化的字典(或 pydantic 结构化数据),再进行 JSON 序列化;
      2. 场景选择:简单场景用asdict()+json.dumps,复用场景用自定义JSONEncoder,生产环境优先用pydantic(兼顾校验和序列化);
      3. 数据服务适配pydantic方案不仅优雅,还能校验数据合法性,是数据服务商处理接口返回、数据传输的最优选择。

      以上就是将Python数据类转换为JSON的三种方法的详细内容,更多关于Python数据类转换为JSON的资料请关注风君子博客其它相关文章!

      您可能感兴趣的文章:

      • 将Python数据类优雅地转换为JSON的方法详解
      • Python中数据类转换为JSON的方法详解
      • Python xml、字典、json、类四种数据类型如何实现互相转换

      站内搜索