编程语言
首页 > 编程语言> > Python:将suds对象序列化为JSON

Python:将suds对象序列化为JSON

作者:互联网

我正在使用suds调用SOAP API,它将数据作为对象而不是原始XML返回.我想保存原始响应的副本以及我解析的内容,最终目标是存储为JSON(我目前正在使用TinyDB进行测试).

整体流程如下:

>检索原始响应
>使用下面的脚本创建原始响应的dict
>解析响应对象供以后使用
>将所有内容序列化为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出现在序列化期间不会抛出错误的其他记录中
> type(Date.Day)是一个int,字段名称是一个字符串

有没有人知道这里发生了什么?它看起来好像正在尝试序列化原始对象,但我插入到TinyDB中的所有内容都已经通过makeDict运行

解决方法:

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

suds对象有时包含一个列表,该列表又包含其他suds对象. makeDict()函数不一定达到最深层次的嵌套,因此它有时会返回一个包含suds对象的dict,该对象无法序列化.

标签:json,python,serialization,suds
来源: https://codeday.me/bug/20190702/1360088.html