Как вывести словарь, который содержит пользовательский класс как значения, используя json в python? - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть словарь signature2GroupLength2UserDefinedClassDict в python.Ключи первого уровня являются строковыми.Ключи второго уровня являются целыми числами, а значения имеют тип, определенный пользователем.Как сделать дамп и позже прочитать этот словарь, используя json в python?

Хотя я определил пользовательский класс следующим образом:

#########################################################################
class UserDefinedClass(JSONEncoder):
    def default(self, o):
        return o.__dict__

    def __init__(self, field1, field2, field3):
        self.field1 = field1
        self.field2 = field2
        self.field3 = field3
#########################################################################

Я все еще получаю

TypeError: Object of type 'UserDefinedClass' is not JSON serializable

когда я звоню

print(json.dumps(signature2Length2ProbDict))

1 Ответ

0 голосов
/ 24 ноября 2018

Из-за определенной JSONEncoder.__init__ подписи и
json.dumps подписи (которую необходимо передать с аргументом ключевого слова cls=, чтобы использовать пользовательский подкласс JSONEncoder), вам не следует объединять пользовательский класс пользователя и пользовательскийКодер JSON.
Пусть работают / живут отдельно:

import json
from json import JSONEncoder

class UserDefinedClass: 
    def __init__(self, field1, field2, field3):
        self.field1 = field1
        self.field2 = field2
        self.field3 = field3

class CustomEncoder(JSONEncoder):
    def default(self, o):
        return o.__dict__    


signature2Length2ProbDict = {'a': {1: UserDefinedClass(*['one', 'two', 'three'])},
                             'b': {2: UserDefinedClass(*['four', 'five', 'six'])}}

print(json.dumps(signature2Length2ProbDict, cls=CustomEncoder))

Вывод:

{"a": {"1": {"field1": "one", "field2": "two", "field3": "three"}}, "b": {"2": {"field1": "four", "field2": "five", "field3": "six"}}}
...