使用Python访问嵌套JSON[AWS元数据]

使用Python访问嵌套JSON[AWS元数据],python,json,amazon-web-services,Python,Json,Amazon Web Services,我正在使用Lambda运行我的AWS帐户,返回所有实例的列表。我需要能够打印出所有的“VolumeId”值,但由于它们是嵌套的,我无法确定如何访问它们。我能够为每个实例打印出first卷ID,但是,有些实例有多个卷,有些只有一个卷。我想我知道为什么我会得到这些结果,但我不知道该怎么做才能让所有的结果都回来 下面是一个实例的JSON的片段: { 'Groups':[], 'Instances':[ { 'AmiLaunchIndex':0, 'ImageId':

我正在使用Lambda运行我的AWS帐户,返回所有实例的列表。我需要能够打印出所有的“VolumeId”值,但由于它们是嵌套的,我无法确定如何访问它们。我能够为每个实例打印出first卷ID,但是,有些实例有多个卷,有些只有一个卷。我想我知道为什么我会得到这些结果,但我不知道该怎么做才能让所有的结果都回来

下面是一个实例的JSON的片段:

{  
'Groups':[],
'Instances':[  
  {  
     'AmiLaunchIndex':0,
     'ImageId':'ami-0',
     'InstanceId':'i-0123',
     'InstanceType':'big',
     'KeyName':'nonprod',
     'LaunchTime':'date',
     'Monitoring':{  
        'State':'disabled'
     },
     'Placement':{  
        'AvailabilityZone':'world',
        'GroupName':'',
        'Tenancy':'default'
     },
     'PrivateDnsName':'secret',
     'PrivateIpAddress':'1.2.3.4',
     'ProductCodes':[  

     ],
     'PublicDnsName':'',
     'State':{  
        'Code':80,
        'Name':'stopped'
     },
     'StateTransitionReason':'User initiated',
     'SubnetId':'subnet-1',
     'VpcId':'vpc-1',
     'Architecture':'yes',            
     'BlockDeviceMappings':[  
        {  
           'DeviceName':'/sda',
           'Ebs':{  
              'AttachTime':'date',
              'DeleteOnTermination':True,
              'Status':'attached',
              'VolumeId':'vol-1'
           }
        },
        {  
           'DeviceName':'/sdb',
           'Ebs':{    
              'AttachTime':'date'),
              'DeleteOnTermination':False,
              'Status':'attached',
              'VolumeId':'vol-2'
           }
        }
     ],
这就是我为获得第一卷ID所做的:

ec2client = boto3.client('ec2')
ec2 = ec2client.describe_instances()
for reservation in ec2["Reservations"]:
    for instance in reservation["Instances"]:
        instanceid = instance["InstanceId"]

        volumes = instance["BlockDeviceMappings"][0]["Ebs"]["VolumeId"]
        print("The associated volume IDs for this instance are: ",(volumes))

我认为我只获取第一个ID的原因是因为我引用了“BlockDeviceMappings”中的第一个元素,但我不知道如何获取其他元素。如果我在不指定[0]的情况下尝试,我会得到
列表索引必须是整数或片,而不是str
错误。我也试着用字典而不是单子,但我觉得我用那本字典找错了方向。如有任何建议/帮助,将不胜感激

一个可能的答案,不是特别像蟒蛇


或者使用json.loads,然后使用.get语法迭代json,如

Perfect,这就是我所需要的。我确实尝试过使用json.load、json.load和json.dumps来实现这一点,但很难做到我所需要的。不断得到相同的
列表索引
错误。谢谢你的解决方案!
id_list = []
volumes_data = instance["BlockDeviceMappings"]
for element in volumes_data:
    id_list.append(element["Ebs"]["VolumeId"])