具有十进制数据类型和json.dumps()的嵌套对象

时间:2019-01-03 01:20:16

标签: python json object encode complextype

我有一个defaultdict的python对象,它使用类对象作为默认值。此类对象包含各种变量,其中一些是Decimal数据类型,一个是日期时间数据类型,而几个变量是列表,依次包含对象,这些对象的变量为Decimal数据类型,日期时间变量以及可以依次包含更多嵌套对象的列表。

class ReportObject(object):
    def __init__(self):
        self.name = None
        self.amount1 = Decimal(0.00)
        self.amount2 = Decimal(0.00)
        self.amount1_transactions = [] # This list can contain nested objects that inherit from the ReportObject
        self.amount2_transactions = [] # This list can contain nested objects that inherit from the ReportObject
        self.purchaseOrder = {}

    def __str__(self):
        return self.__dict__

    def __repr__(self):
        return str(self.__dict__)

    def __json__(self):
        dt = {}
        for key, value in self.__dict__.items():
            if type(value) == 'list':
                dt_list = list()
                for dt_val in value:
                    dt_list.append(dt_val.__json__())
                dt[key] = dt_list
            else:
                dt[key] = str(value)
        return dt

我要json.dumps尝试的数据是这些defaultdict中的ReportObjects

当我去调用json.dumps(data, default: lambda o: o.__json__())时,列表中的变量将被表示为原始字符串,而不是每个列表中对象的数组。有没有更干净的方法来编码此自定义JSON编码功能?我无法从子类json.JSONEncoder中找出解决方案。

1 个答案:

答案 0 :(得分:1)

if type(value) == 'list':永远不会为真,因此您总是在执行else情况(正如您所观察到的value一样)。 type(value)返回value是其实例的类,而不是描述它的字符串。 test you want is

if type(value) is list:      # Only allows lists; since types are singletons, use identity test, not equality

或:

if isinstance(value, list):  # Allows list subclasses

请注意,list周围没有引号;指向类型,而不是描述它的字符串。