Как JSON сериализовать объект и включить атрибуты @property, исключая функции? - PullRequest
1 голос
/ 20 мая 2019

Есть довольно много вопросов, связанных с этим, но не дает мне именно то, что я хочу.

Допустим, у меня есть такой класс:

import json


class MyClass:

    def __init__(self, name, some_type):

        self.name = name
        self.some_type = some_type

    @property
    def prop(self):

        return self.name + self.some_type

    def to_json(self):

        return json.dumps(
            self, default=lambda o: o.__dict__
        )


el1 = MyClass('test', '_to_json')

Теперь я хотел бы получить представление JSON, которое включает в себя name, some_type, а также prop.

Функция to_json в настоящее время возвращает только

{"name": "test", "some_type": "_to_json"}

так что prop отсутствует (как и в vars(el1)).

dir возвращает (а также все __)

'name', 'prop', 'some_type', 'to_json'

и я не хочу to_json в списке.

Есть ли простой способ обновить мою функцию to_json, чтобы она возвращала

{"name": "test", "some_type": "_to_json", "prop": "test_to_json"}

1 Ответ

1 голос
/ 20 мая 2019

Вы можете найти prop в __class__.__dict__:

import json


class MyClass:

    def __init__(self, name, some_type):

        self.name = name
        self.some_type = some_type

    @property
    def prop(self):

        return self.name + self.some_type

    def to_json(self):
        def get_object_dict(obj):
            d = obj.__dict__.copy()
            for key, value in obj.__class__.__dict__.items():
                if isinstance(value, property):
                    d[key] = getattr(obj, key)
            return d


        return json.dumps(
            self, default=lambda o: get_object_dict(o)
        )


el1 = MyClass('test', '_to_json')
print(el1.to_json())

Выход:

{"prop": "test_to_json", "some_type": "_to_json", "name": "test"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...