python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python数据类转换为JSON

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

作者:数研小生

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

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

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

方法 1:基础优雅方案(dataclasses.asdict + json.dumps)

这是官方推荐的基础方案,通过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
}

关键解释

方法 2:复用性更强的方案(自定义 JSON 编码器)

如果需要多次序列化 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
}

关键解释

方法 3:生产级优雅方案(使用 pydantic,推荐)

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

步骤 1:安装 pydantic

pip install pydantic 

步骤 2:代码实现

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
}

关键解释

总结

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

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

您可能感兴趣的文章:
阅读全文