JSON Сериализует диктат с помощью вложенного пользовательского объекта

Были другие вопросы, спрашивающие, как сериализовать объект пользовательского класса. Но ответы были специфичны только для одного объекта. Вместо этого я хочу создать словарь, в котором в качестве значения используется объект пользовательского класса. Я хочу использовать метод json.dump

example_dict_format = {
    "name_A": [message0, message1, ...],
    "name_B": [message0, ...], ...
}

class Message:
    def __init__(self, time, message):
        self.time = time
        self.message = message

    def toJSON(self):
        return json.dump(self.__dict__)

    def __repr__(self):
        return self.toJson()

Пользовательский класс не так сложен, его достаточно просто представить в виде словаря. Я пытался добавить __repr__ и toJSON в класс, не сработало. Я получил следующую ошибку

raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Message is not JSON serializable

Вопрос: как вы выбрасываете такой словарь?

Всего 2 ответа


class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Message):
            obj_dict = {key: str(obj.__dict__[key]) for key in obj.__dict__}
            return obj_dict
        # Let the base class default method raise the TypeError
        return json.JSONEncoder.default(self, obj)

json.dump(result, fp, cls=ComplexEncoder, indent=4)

user2099394 ответ правильный, но если вы хотите сохранить код как часть класса, который вы пытаетесь кодировать, то вы можете сделать это с помощью грубой силы:

class Message:
    def __init__(self, time, message):
        self.time = time
        self.message = message

    def toJson(self):
        d = {}
        d["time"] = str(self.time)
        d["message"] = self.message
        return json.dumps(d)

Есть идеи?

10000