Сериализация пользовательского объекта внутри объекта json - PullRequest
1 голос
/ 25 марта 2020

Я использую стороннюю библиотеку python, которая возвращает некоторые данные в списках и словарях внутри них (формат JSON). Например, вот пример записи:

data = [{'a': 1, 'b': 80, 'c': 42, 'd': [{'r': 0, 's': '1', 'u': 5}], 'id': 10, 'k': 60, 'v': 0, 'm': 
{'ty': 'djp', 'nr': '10', 'bc': Adder('179'), 'in': 3}}, {'a': 1, 'b': 70, 'c': 42, 'd': [{'r': 0, 's': 
'1', 'u': 5}], 'y': 10, 'k': 60, 'v': 0, 'm': {'ty': 'djp', 'dx': '10', 'tx': Adder('179'), 'in': 3}}]

Моя проблема с классом 'Adder', который является объектом. Все остальное - просто строки.

Итак, когда я делаю:

json.dumps(data)

Это вызывает сообщение об ошибке:

Сумматор ('179') не JSON serializable.

Меня не волнует сериализация этого класса Adder, поэтому я хотел бы просто сделать его строкой, например, "Adder (179)", если это возможно. Можно ли заставить работать функцию дампов? Класс Adder не мой, может быть, я могу сделать его сериализованным или сказать, что делать с ним, отредактировав источник или что-то еще? Любой простой способ будет в порядке.

1 Ответ

3 голосов
/ 25 марта 2020

Просто укажите пользовательский класс кодировщика :

class RobustEncoder(json.JSONEncoder):
    def default(self, o):
        try:
            return super(RobustEncoder, self).default(o)
        except TypeError:
            return str(o)    

json.dumps(data, cls=RobustEncoder)

Аргумент ключевого слова cls задокументирован в документах json.dump.

...