首页 > 解决方案 > 使用python从嵌套的JSON中提取数据

问题描述

我希望有人可以帮助我解决我遇到的嵌套 JSON 响应的问题。我已经尝试破解这个几个星期了,但没有成功。

我正在尝试使用站点 API 创建一个字典,该字典可以为每个用户保存从 JSON 响应中提取的三条信​​息。第一个 JSON 响应包含我需要的用户 uid 和 crmid。

API 返回一个大型 JSON 响应,每个帐户都有一个对象。单个帐户的摘录如下所示:

{   
'uid': 10, 
'key': 
        '[
        N@839374', 
        'customerUid': 11, 
        'selfPaid': True, 
        'billCycleAllocationMethodUid': 1, 
        'stmtPaidForAccount': False, 
        'accountInvoiceDeliveryMethodUid': 1, 
        'payerAccountUid': 0, 
        'countryCode': None, 
        'currencyCode': 'GBP', 
        'languageCode': 'en', 
        'customFields': 
                        {
                        'field': 
                                [{
                                'name': 'CRMID', 
                                'value': '11001'
                                }
                                ]
                        }, 
        'consentDetails': [], 
'href': '/accounts/10'}

我做了一个循环,为每个帐户提取每个 UID:

    get_accounts = requests.get('https://website.com/api/v1/accounts?access_token=' + auth_key)
    all_account_info = get_accounts.json()
    account_info = all_account_info['resource']
    
    account_information = {}

    for account in account_info:
        account_uid = account['uid']

我现在正在尝试提取 CRMID 值,在本例中为 '11001': {'name': 'CRMID', 'value': '11001'}。

我整个星期都在努力完成这项工作,我有两个问题:

  1. 我想从 JSON 响应中深度嵌套的“customFields”字典中提取 UID(我已经完成)和 CRMID。我设法到达 ['key'][0],但我不确定如何访问嵌套在列表中的下一个字典。

  2. 我想以以下格式将此信息存储在字典中:

{'accounts': [{'uid': 10, 'crmid': 11001, 'amount': ['bill': 4027]}{'uid': 11, 'crmid': 11002, 'amount': ['账单':1054]}]}

(“账单”信息将来自单独的 JSON 响应。)

我的问题是,对于我设计的每个循环,字典似乎只保存一个帐户/它循环的最后一个帐户。我想不出一种在使用循环时追加到字典而不是覆盖的方法。如果有人有关于如何做到这一点的有用链接,将不胜感激。

我的最终目标是拥有一个字典,其中包含每个帐户的三条信息(uid、crmid、bill)。然后,我将把它导出到 CSV 文档中。

任何帮助、指导、有用的链接等将不胜感激。

标签: pythonarraysjsondictionarynested

解决方案


关于问题 1,在您向下打印每个级别时可能会有所帮助,然后尝试找出如何访问您在该级别返回的对象。如果它是一个数组,它将使用像 [0] 这样的数字表示法,如果它是一个字典,它将使用像 ['key'] 这样的键表示法

关于问题 2,您的字典需要唯一键。您可能每次都在循环并替换整个内容。

您建议的最终结构有点偏离,将其想象为:

accounts: {
    '10': {
        'uid': '10',
        'crmid': 11001, 
        'amount': {
            'bill': 4027
                  } 
          },
    '11': {
        'uid': '11',
        'crmid': 11011, 
        'amount': {
            'bill': 4028
                  } 
          }
          }
etc.

因此,您可以访问accounts['10']['crmid']accounts['10']['amount']['bill']例如。


推荐阅读