当前位置: 代码网 > it编程>前端脚本>Python > 将Python数据类转换为JSON的三种方法

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

2026年01月18日 Python 我要评论
文章介绍在 python 中把数据类(dataclass)以优雅、规范的方式转换成 json 格式的方法,这是数据处理场景中非常实用的需求,尤其贴合你作为数据服务商的技术工作场景。python 内置的

文章介绍在 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
}

关键解释

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

方法 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
}

关键解释

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

方法 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
}

关键解释

  • 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的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com