【问题标题】:Parsing a nested JSON(?) object in Python在 Python 中解析嵌套的 JSON(?) 对象
【发布时间】:2020-12-17 23:55:02
【问题描述】:

我使用 zeep 调用 web 服务。

response = proces.service.Load(**params2, _soapheaders={'Header': header_value})

这会返回一个看起来像这样的对象

{
    'LoadResult': None,
    'hierarchy': {     
        'Code': 'FTE', 
        'Name': 'Balans en Winst & verlies',
        'Description': None,
        'RootNode': {
            'Id': 757,
            'Code': 'FTE',
            'Name': 'Balans en Winst & 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 在粘贴用双引号纠正的字符串时会这样说

【问题讨论】:

  • response 已被解析为 Python 对象。无需再次解析。
  • 当我输入(响应)时,它会显示 Class
  • 您可以使用response.hierarchy.Code 之类的方式访问嵌套数据。为什么你认为你需要从 JSON 转换它?
  • 嗯,我猜是因为每个关于 python 对象到表的谷歌结果都谈到了 JSON 数据。否则我不知道该怎么做
  • 以同样的方式访问所有属性。 response.hierarchy.RootNode.ChildNodes.HierarchyNode

标签: python json api zeep


【解决方案1】:

JSON 已经被 API 库解析,并构建了可以使用属性访问的对象层次结构。该类显然还提供了自己的__repr__() 方法,使其看起来像字典的层次结构;但它实际上不是字典,所以你不能使用['Attribute'] 语法。

如果你想遍历HierarchyNode 列表,你可以使用

for node in response.hierarchy.RootNode.ChildNodes.HierarchyNode:
    print(node.Id, node.Name, node.Code)

【讨论】:

  • 嘿 Barmar,多亏了您的评论,我才开始工作。我将更新我的起始帖子以反映代码。谢谢你一直陪着我。
  • 您不应该将解决方案放在问题中。如果您有比我更完整的解决方案,请将其作为答案发布。
【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2023-03-10
    • 1970-01-01
    • 2021-12-23
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多