文章介绍在 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
}关键解释:
- 重写
jsonencoder的default方法,自动识别 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 序列化一体化,减少冗余代码。
总结
- 核心思路:python dataclass 转 json 的关键是先将实例转为可序列化的字典(或 pydantic 结构化数据),再进行 json 序列化;
- 场景选择:简单场景用
asdict()+json.dumps,复用场景用自定义jsonencoder,生产环境优先用pydantic(兼顾校验和序列化); - 数据服务适配:
pydantic方案不仅优雅,还能校验数据合法性,是数据服务商处理接口返回、数据传输的最优选择。
以上就是将python数据类转换为json的三种方法的详细内容,更多关于python数据类转换为json的资料请关注代码网其它相关文章!
发表评论