python 类转为json字符串

举报
林欣 发表于 2025/11/21 17:41:49 2025/11/21
【摘要】 在 Python 中,将类实例转换为 JSON 字符串通常需要先将对象转换为字典(dict),然后再使用 json.dumps() 方法进行序列化。以下是几种常见的方法: 方法 1:手动实现 __dict__ 或自定义方法如果类的属性是简单的键值对,可以直接使用 __dict__ 属性(但需注意它可能包含不需要的属性,如 _private 或方法)。import jsonclass Pers...

在 Python 中,将类实例转换为 JSON 字符串通常需要先将对象转换为字典(dict),然后再使用 json.dumps() 方法进行序列化。以下是几种常见的方法:


方法 1:手动实现 __dict__ 或自定义方法

如果类的属性是简单的键值对,可以直接使用 __dict__ 属性(但需注意它可能包含不需要的属性,如 _private 或方法)。

import json

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建实例
p = Person("Alice", 30)

# 转换为 JSON
json_str = json.dumps(p.__dict__)
print(json_str)  # 输出: {"name": "Alice", "age": 30}

问题:如果类包含非序列化属性(如日期、自定义对象),会抛出 TypeError


方法 2:自定义 to_dict() 方法

更灵活的方式是定义一个方法,显式控制哪些属性需要序列化。

import json
from datetime import datetime

class User:
    def __init__(self, name, created_at):
        self.name = name
        self.created_at = created_at  # datetime 对象无法直接序列化

    def to_dict(self):
        return {
            "name": self.name,
            "created_at": self.created_at.isoformat()  # 转换为字符串
        }

# 创建实例
u = User("Bob", datetime.now())

# 转换为 JSON
json_str = json.dumps(u.to_dict())
print(json_str)

方法 3:使用 dataclasses(Python 3.7+)

如果使用 dataclass,可以通过 asdict() 函数自动转换。

from dataclasses import dataclass, asdict
import json

@dataclass
class Product:
    id: int
    name: str
    price: float

# 创建实例
prod = Product(1, "Laptop", 999.99)

# 转换为 JSON
json_str = json.dumps(asdict(prod))
print(json_str)  # 输出: {"id": 1, "name": "Laptop", "price": 999.99}

方法 4:继承 json.JSONEncoder

通过继承 JSONEncoder,自定义复杂对象的序列化逻辑。

import json
from datetime import datetime

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        elif hasattr(obj, "__dict__"):
            return obj.__dict__
        else:
            return super().default(obj)  # 其他类型抛出 TypeError

class Event:
    def __init__(self, name, timestamp):
        self.name = name
        self.timestamp = timestamp

# 创建实例
e = Event("Meeting", datetime.now())

# 使用自定义 Encoder
json_str = json.dumps(e, cls=CustomEncoder)
print(json_str)

方法 5:使用第三方库(如 marshmallow

对于复杂场景(如验证、嵌套对象),推荐使用库如 marshmallow

from marshmallow import Schema, fields

class Artist:
    def __init__(self, name, genre):
        self.name = name
        self.genre = genre

class ArtistSchema(Schema):
    name = fields.Str()
    genre = fields.Str()

# 创建实例
artist = Artist("Tool", "Rock")

# 序列化
schema = ArtistSchema()
json_str = schema.dumps(artist)
print(json_str)  # 输出: {"name": "Tool", "genre": "Rock"}

注意事项

  1. 循环引用:如果对象属性互相引用,会导致无限递归。需手动处理或使用 ignore 参数。
  2. 性能:频繁序列化时,dataclassesmarshmallow 比手动 __dict__ 更高效。
  3. 安全性:避免直接序列化用户输入的对象,防止信息泄露(如 __dict__ 包含敏感字段)。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。