具有 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
周围缺少引号;指的是类型,而不是描述它的字符串。
我有一个 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
周围缺少引号;指的是类型,而不是描述它的字符串。