解析Suds SOAP复杂数据类型到Python dict

Jam*_*ull 6 python soap dictionary suds

我有一些来自SOAPAPI的数据Suds,我需要在Python脚本中解析它.在我离开并编写解析器之前(不仅仅是这个要做):

1)有人认识到这是什么吗?它是Suds (文档)返回的标准复杂对象数据类型.应该发现那个.

2)如果是这样,是否有可用于将其转换为Python字典的现有库?如何将此对象解析为Python dict?我似乎可以将字典传递给Suds,但看不到一个简单的方法让一个人退出.

(ArrayOfBalance){
   Balance[] = 
      (Balance){
         Amount = 0.0
         Currency = "EUR"
      },
      (Balance){
         Amount = 0.0
         Currency = "USD"
      },
      (Balance){
         Amount = 0.0
         Currency = "GBP"
      },
 }
Run Code Online (Sandbox Code Playgroud)

aay*_*rva 13

在类中调用dict了一个类方法,suds.client.Client它接受一个sudsobject输入并返回一个Python dict作为输出.在这里查看:官方Suds文档

生成的代码段变得如此优雅:

from suds.client import Client

# Code to obtain your suds_object here...

required_dict = Client.dict(suds_object)
Run Code Online (Sandbox Code Playgroud)

您可能还想检查同一类中的items类方法(链接),该类从suds_object中提取类似于items方法的项目dict.

  • 给你一个浅拷贝,如果你有嵌套的sudsobjects,它是毫无价值的 (3认同)

rad*_*tek 7

您可以将对象强制转换为dict(),但仍然可以获得suds使用的复杂数据类型.所以这里是我为这个场合写的一些有用的函数:

def basic_sobject_to_dict(obj):
    """Converts suds object to dict very quickly.
    Does not serialize date time or normalize key case.
    :param obj: suds object
    :return: dict object
    """
    if not hasattr(obj, '__keylist__'):
        return obj
    data = {}
    fields = obj.__keylist__
    for field in fields:
        val = getattr(obj, field)
        if isinstance(val, list):
            data[field] = []
            for item in val:
                data[field].append(basic_sobject_to_dict(item))
        else:
            data[field] = basic_sobject_to_dict(val)
    return data


def sobject_to_dict(obj, key_to_lower=False, json_serialize=False):
    """
    Converts a suds object to a dict.
    :param json_serialize: If set, changes date and time types to iso string.
    :param key_to_lower: If set, changes index key name to lower case.
    :param obj: suds object
    :return: dict object
    """
    import datetime

    if not hasattr(obj, '__keylist__'):
        if json_serialize and isinstance(obj, (datetime.datetime, datetime.time, datetime.date)):
            return obj.isoformat()
        else:
            return obj
    data = {}
    fields = obj.__keylist__
    for field in fields:
        val = getattr(obj, field)
        if key_to_lower:
            field = field.lower()
        if isinstance(val, list):
            data[field] = []
            for item in val:
                data[field].append(sobject_to_dict(item, json_serialize=json_serialize))
        else:
            data[field] = sobject_to_dict(val, json_serialize=json_serialize)
    return data


def sobject_to_json(obj, key_to_lower=False):
    """
    Converts a suds object to json.
    :param obj: suds object
    :param key_to_lower: If set, changes index key name to lower case.
    :return: json object
    """
    import json
    data = sobject_to_dict(obj, key_to_lower=key_to_lower, json_serialize=True)
    return json.dumps(data)
Run Code Online (Sandbox Code Playgroud)

如果有更简单的方法,我很乐意听到它.