Синтаксический анализ вложенного объекта JSON (?) в Python

#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)