将一个对象序列化为JSON



我正在使用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:Python27Libjsonencoder.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

运行了。

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

suds对象有时包含一个列表,该列表又包含其他suds对象。makeDict()函数不一定要达到嵌套的最深层,所以它有时返回一个包含不能序列化的suds对象的字典。

最新更新