【问题标题】:Python: Serialize suds object to JSONPython:将 suds 对象序列化为 JSON
【发布时间】:2015-07-27 15:25:57
【问题描述】:

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

整体流程如下:

  1. 检索原始响应
  2. 使用以下脚本创建原始响应的字典
  3. 解析响应对象以供以后使用
  4. 将所有内容序列化为 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

这个错误让我失望,因为:

  1. 我知道这个对象Date出现在序列化过程中不会抛出错误的其他记录中
  2. type(Date.Day) 是一个int,字段名是一个字符串

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

【问题讨论】:

  • 如果性能不是太大问题,我会在代码中添加一些明智的 json.dumps,然后对异常进行特殊处理。例如,在接近底部的 out[k] = v 处,我将添加 json.dumps(v)。 IIRC json 甚至不太擅长 javascript 中的日期 - 往返它们是原生 js date => string repr of date => string repr of date,而不是原生 js date。
  • stackoverflow.com/questions/2167894/… - Alex Martelli 解释了为什么不能序列化 suds

标签: python json serialization suds


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    相关资源
    最近更新 更多