Python:将suds对象序列化为JSON

4
我正在使用suds调用SOAP API,它返回的数据是对象而不是原始XML。我想要保存原始响应的副本以及我解析的内容,最终目标是将其存储为JSON(我目前正在使用TinyDB进行测试)。
整个流程如下:
1. 检索原始响应 2. 使用以下脚本创建原始响应的字典 3. 解析响应对象以供以后使用 4. 将所有内容序列化为JSON并存储在TinyDB中
我用于将suds对象转换为字典的脚本如下:
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

这个错误让我感到困扰,因为:

  1. 我知道这个对象 Date 出现在其他记录中,在序列化过程中没有出错
  2. Date.Day 的类型是整型而字段名称是字符串

有人知道这里发生了什么吗?看起来好像在尝试序列化原始对象,但我将所有插入 TinyDB 中的内容都通过 makeDict 处理过了。


如果性能不是太大的问题,我会在代码中添加一些明智的json.dumps,然后对异常进行特殊处理。例如,在out[k] = v附近的底部,我会添加*json.dumps(v)*。我IRC json甚至在javascript中的日期方面也不是很好-往返转换是本地js日期=>日期字符串表示=>日期字符串表示,而不是本地js日期。 - JL Peyret
1
Alex Martelli解释了为什么您无法序列化suds。 - Peter M. - stands for Monica
1个回答

3

我想我会回答自己的问题,而不是删除它,以防其他人遇到这个问题。

suds对象有时包含一个列表,该列表又包含其他suds对象。由于makeDict()函数并不总是到达最深层次的嵌套,因此它有时会返回一个包含无法序列化的suds对象的字典。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接