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

Nested object with Decimal data type and json.dumps()

我有一个 python 对象,它是一个 defaultdict 使用 class 对象作为其默认值的对象。这个 class 对象包含各种变量,其中一些是 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 的数据是这些 ReportObjects 中的 defaultdict 个。

当我调用 json.dumps(data, default: lambda o: o.__json__()) 时,作为列表的变量被表示为原始字符串,而不是每个列表中的对象数组。是否有更简洁的方法来编写此自定义 JSON 编码功能?我不知道如何通过 subclassing json.JSONEncoder.

实现解决方案

if type(value) == 'list': 永远不会计算为真,因此您 总是 执行 else 案例(将 value 字符串化,因为您观测到的); type(value) returns class 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 周围缺少引号;指的是类型,而不是描述它的字符串。