我使用suds调用SOAP API,它将数据作为对象而不是原始XML返回。我想保存原始响应的副本以及我解析的内容,最终目标是存储为JSON(我目前正在使用TinyDB进行测试)。
整体流程如下:
我将suds对象转换为dict的脚本是:
def makeDict(response):
out = {}
for k, v in asdict(response).iteritems():
if hasattr(v, '__keylist__'):
out[k] = makeDict(v)
elif isinstance(v, list):
out[k] = []
for item in v:
if hasattr(item, '__keylist__'):
out[k].append(makeDict(item))
else:
out[k].append(item)
else:
out[k] = v
return out
但是,有时当我运行makeDict(object)
并尝试序列化为JSON时,我会收到如下类型错误:
File "C:\Python27\Lib\json\encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: (Date){
Day = 7
Month = 8
Year = 2004
} is not JSON serializable
这个错误让我失望,因为:
Date
出现在序列化期间未引发错误的其他记录中有没有人知道这里发生了什么?它看起来好像在尝试序列化原始对象,但我插入到TinyDB中的所有内容都已经通过makeDict
答案 0 :(得分:2)
我想我会回答我自己的问题而不是删除它以防其他人遇到这个问题。
suds对象有时包含一个列表,该列表又包含其他suds对象。 makeDict()
函数不一定达到最深层次的嵌套,因此它有时会返回一个包含suds对象的dict,该对象无法序列化。