我有一个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
中找出解决方案。
答案 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
周围没有引号;指向类型,而不是描述它的字符串。