#python #json #api #zeep
#питон #json #API #зип
Вопрос:
Я использую zeep для вызова веб-сервиса.
response = proces.service.Load(**params2, _soapheaders={'Header': header_value})
Это возвращает объект, который выглядит следующим образом
{
'LoadResult': None,
'hierarchy': {
'Code': 'FTE',
'Name': 'Balans en Winst amp; verlies',
'Description': None,
'RootNode': {
'Id': 757,
'Code': 'FTE',
'Name': 'Balans en Winst amp; verlies',
'Description': None,
'Accounts': None,
'ChildNodes': {
'HierarchyNode': [
{
'Id': 758,
'Code': '000',
'Name': 'Immateriële vaste activa',
'Description': None,
'Accounts': None,
'ChildNodes': {
'HierarchyNode': [
{
'Id': 759,
'Code': '00010',
'Name': 'Goodwill',
'Description': None,
'Accounts': {
'HierarchyAccount': [
{
'Type': 'BAS',
'Code': '0100',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0105',
'BalanceType': 'Balance'
}
]
},
'ChildNodes': None,
'Messages': None,
'Touched': 173
}
]
},
'Messages': None,
'Touched': 173
},
{
'Id': 760,
'Code': '010',
'Name': 'Materiële vaste activa',
'Description': None,
'Accounts': None,
'ChildNodes': {
'HierarchyNode': [
{
'Id': 761,
'Code': '01010',
'Name': 'Bedrijfsgebouwen en -terreinen',
'Description': None,
'Accounts': {
'HierarchyAccount': [
{
'Type': 'BAS',
'Code': '0090',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0110',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0115',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0120',
'BalanceType': 'Balance'
},
{
'Type': 'BAS',
'Code': '0125',
'BalanceType': 'Balance'
}
]
},
'ChildNodes': None,
'Messages': None,
'Touched': 173
},
{
'Id': 762,
'Code': '01020',
'Name': 'Machines en installaties',
'Description': None,
'Accounts': {
и т.д.
Мне нужна эта иерархия для отчета. Я хочу, чтобы результирующая таблица выглядела примерно так
Итак, слева направо, начиная с самой низкой иерархии.
Как я могу наилучшим образом достичь этого? Это не просто простой ответ в формате json. В нем говорится, что он не может быть сериализован.
и
Я читал, что JSON не должен содержать одинарных кавычек. Когда я пытаюсь исправить это:
Jsonlint говорит об этом при вставке строки, исправленной двойными кавычками
Комментарии:
1.
response
уже был проанализирован в объект Python. Вам не нужно анализировать его снова.2. Когда я набираю (ответ), он говорит Class
3. Вы можете получить доступ к вложенным данным, используя такие вещи, как
response.hierarchy.Code
. Как вы думаете, почему вам нужно преобразовать его из JSON?4. Хм, я думаю, потому что каждый результат Google об объекте python в таблице говорит о данных JSON. Я не уверен, как поступить иначе
5. Просто получите доступ ко всем атрибутам одним и тем же способом.
response.hierarchy.RootNode.ChildNodes.HierarchyNode
Ответ №1:
Библиотека API уже проанализировала JSON и создала иерархию объектов, к которым можно получить доступ с помощью атрибутов. Класс также, по-видимому, предоставляет свой собственный __repr__()
метод, который делает его похожим на иерархию словарей; но на самом деле это не словари, поэтому вы не можете использовать ['Attribute']
синтаксис.
Если вы хотите просмотреть HierarchyNode
список, вы можете использовать
for node in response.hierarchy.RootNode.ChildNodes.HierarchyNode:
print(node.Id, node.Name, node.Code)
Комментарии:
1. Привет, Бармар, я заставил его работать благодаря вашему комментарию. Я обновлю свой начальный пост, чтобы отразить код. Спасибо, что поддерживаете меня.
2. Вы не должны помещать решение в вопрос. Если у вас есть более полное решение, чем мое, опубликуйте его в качестве ответа.
Ответ №2:
Заставил его работать с помощью
for node in response.hierarchy.RootNode.ChildNodes.HierarchyNode:
if(hasattr(node.ChildNodes, 'HierarchyNode')):
for nood in node.ChildNodes.HierarchyNode:
if(hasattr(nood.Accounts, 'HierarchyAccount')):
for noodje in nood.Accounts.HierarchyAccount:
print(noodje.Code, noodje.Type,node.Id,node.Name,nood.Name, nood.Code)