繁体   English   中英

如何提取嵌套的JSON数据?

[英]How to extract nested JSON data?

我正在尝试从数据JSON获取值。 我已经成功遍历了JSON数据,几乎满足了我的需求!

在Python中运行以下命令: autoscaling_name = response['Reservations'][0]['Instances'][0]['Tags']

给我这个:

'Tags': [{'Key': 'Name', 'Value': 'Trove-Dev-Inst : App WebServer'}, {'Key': 'aws:autoscaling:groupName', 'Value': 'CodeDeploy_Ernie-dev-Autoscaling-Deploy_d-4WTRTRTRT'}, {'Key': 'CodeDeployProvisioningDeploymentId', 'Value': 'd-4WTRTRTRT'}, {'Key': 'Environment', 'Value': 'ernie-dev'}]

我只想获取值"CodeDeploy_Ernie-dev-Autoscaling-Deploy_d-4WTRTRTRT" 这是从键"aws:autoscaling:groupName"

如何进一步执行命令,仅返回值"CodeDeploy_Ernie-dev-Autoscaling-Deploy_d-4WTRTRTRT"

这是完整的输出吗? 这本字典包含带有嵌套字典的列表,因此您应该这样处理。 假设它被称为:

A = {
    "Tags": [
        {
            "Key": "Name",
            "Value": "Trove-Dev-Inst : App WebServer"
        },
        {
            "Key": "aws:autoscaling:groupName",
            "Value": "CodeDeploy_Ernie-dev-Autoscaling-Deploy_d-4WTRTRTRT"
        },
        {
            "Key": "CodeDeployProvisioningDeploymentId",
            "Value": "d-4WTRTRTRT"
        },
        {
            "Key": "Environment",
            "Value": "ernie-dev"
        }
    ]
}

您的第一个地址是对象,然后是字典中的键,列表中的索引以及该字典的键:

print(A['Tags'][1]['Value'])

输出:

CodeDeploy_Ernie-dev-Autoscaling-Deploy_d-4WTRTRTRT

编辑:根据您所得到的然后您应该尝试:

autoscaling_name = response['Reservations'][0]['Instances'][0]['Tags'][1]['Value']

您还可以使用glom这对于深度嵌套的函数非常有用,并且具有许多用途,可简化复杂的嵌套任务。

例如,翻译@Celius的答案:

glom(A, 'Tags.1.Value')

返回相同的内容:

CodeDeploy_Ernie-dev-Autoscaling-Deploy_d-4WTRTRTRT

因此,要回答您的原始问题,您将使用:

glom(response, 'Reservations.0.Instances.0.Tags.1.Value')

最终的代码是-

    tags = response['Reservations'][0]['Instances'][0]['Tags']
    autoscaling_name = next(t["Value"] for t in tags if t["Key"] == "aws:autoscaling:groupName")

这还可以确保,如果将数据的顺序移至JSON数据中,它仍将找到正确的顺序。

对于任何想尽力了解列表理解和迭代器的人, cherrypicker软件包( pip install --user cherrypicker )为您轻松完成以下任务:

from cherrypicker import CherryPicker

tags = CherryPicker(response['Reservations'][0]['Instances'][0]['Tags'])

tags(Key="aws:autoscaling:groupName")[0]["Value"].get()

这将为您提供'CodeDeploy_Ernie-dev-Autoscaling-Deploy_d-4WTRTRTRT' 如果期望多个值,请省略[0]以返回具有关联的"aws:autoscaling:groupName"键的所有值的列表。

对于您的问题,这可能有点矫kill过正,只需简单的列表理解即可轻松解决。 但是,如果您以后需要做更复杂的事情,例如只匹配部分键(例如aws:*或更复杂的东西,例如正则表达式),或者需要根据中间值进行过滤,则此方法可能会派上用场嵌套对象的图层。 这种任务可能会导致许多复杂的嵌套循环或列表理解,而对于CherryPicker,它只是一个简单的可能单行的命令。

您可以在https://cherrypicker.readthedocs.io上找到有关高级用法的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM