L'analyse de la Mousse de SAVON complexe de type de données en Python dict
J'ai des données en provenance d'un SOAP
de l'API à l'aide de Suds
laquelle j'ai besoin d'analyser dans mon Python
script. Avant j'aller et écrire un analyseur syntaxique (il y a plus que cela à faire):
1) personne Ne reconnaître ce que c'est? C'est le standard complexe de l'objet type de données retourné par Suds
(documentation). Devrait avoir repéré que.
2) Si oui, est-il une bibliothèque existante que je peux utiliser pour convertir un dictionnaire Python? Comment dois-je analyser cet objet en Python dict? Il semble que je peux passer d'un dictionnaire à la Mousse, mais ne peut pas voir un moyen facile d'obtenir un retour.
(ArrayOfBalance){
Balance[] =
(Balance){
Amount = 0.0
Currency = "EUR"
},
(Balance){
Amount = 0.0
Currency = "USD"
},
(Balance){
Amount = 0.0
Currency = "GBP"
},
}
- wow .. je peux honnêtement dire que dans 20 ans, en faisant cela, je n'ai jamais vu cette forme de sérialisation. Maintenant je sais ce que c'est lol. Pouvez-vous nous donner un contexte pour les données?
- Heureux, il n'est pas juste moi! C'est le wallet balance réponse de OKPay de l'API
- Il semble que certains de self-made-structure de données :-\
- Comme je le soupçonnais. Il se comporte effectivement comme un objet. Si vous essayez et de la réponse.split(',') il donne
AttributeError: ArrayOfBalance instance has no attribute 'split'
. Va fouiller dans la doc un peu plus.
Vous devez vous connecter pour publier un commentaire.
Il y a une méthode de classe, appelée
dict
danssuds.client.Client
classe qui prend unsudsobject
en entrée et renvoie un Pythondict
en sortie. Découvrez-le ici: Officiel De La Mousse De La DocumentationL'résultant extrait devient aussi élégant que cette:
Vous pourriez également vouloir vérifier
items
méthode de classe (lien) dans la même classe qui extrait les éléments de suds_object similaire àitems
méthode surdict
.Vous pouvez convertir l'objet de
dict()
, mais vous obtenez toujours le type de données complexe utilisée par de la mousse. Voici donc quelques fonctions utiles que j'ai écrit juste pour l'occasion:Si il ya un moyen plus facile, j'aimerais en entendre parler.
Trouvé un solution:
Si subs sont juste imbriquée dict et liste, cela devrait fonctionner.
J'étais confronté à un problème similaire et a dû lire la mousse de réponse.
La mousse réponse vous sera retourné comme un tuple composé d'objets.
len(réponse) va vous montrer le nombre d'objets contenus dans les suds à la réponse n-uplet.
Afin d'accéder à la première de l'objet, nous avons besoin de donner
response[0]
.Au RALENTI si vous tapez
>>>print response[0]
suivie par un point". " symbole vous obtiendrez une fenêtre montrant les différents objets qui peuvent être accessibles à partir de ce niveau.Exemple: si vous tapez
response[0]
. il apportera une fenêtre et afficher le Solde de l'objet de sorte que la commande serait désormaisresponse[0].Balance
.Vous pouvez suivre la même démarche pour obtenir la liste des objets dans les niveaux suivants
La bonne réponse, comme c'est souvent le cas, est dans les docs. Les bits (entre parenthèses) sont des objets qui peuvent contenir d'autres objets ou de types.
Dans ce cas nous avons une
ArrayOfBalance
objet qui contient une liste deBalance
types, chacun de qui a les attributs deAmount
etCurrency
.Ceux-ci peuvent tous être appelée à l'aide
.
notation de sorte que le one-liner suivant est le tour est joué.La checkaayush la réponse n'est pas récursif donc, il ne considère pas les objets imbriqués.
Basé sur aGuegu Réponse, j'ai fait quelques modifications pour résoudre un problème lors de la mousse objet a dicts à l'intérieur des listes.
Ça marche!!!