如何在python中使用json将包含用户定义的类作为值的字典转储?

时间:2018-11-24 06:35:12

标签: python json class dictionary dump

我在python中有一个字典signature2GroupLength2UserDefinedClassDict。 一级键是字符串。 第二级键是整数,值是用户定义的类类型。 如何转储并稍后在python中使用json阅读此词典?

尽管我定义了用户定义的类,如下所示:

#########################################################################
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 :(得分:1)

由于特定的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"}}}