我正在尝试从数据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"
?
答案 0 :(得分:5)
这是完整的输出吗?这本字典包含带有嵌套字典的列表,因此您应该这样处理。假设它被称为:
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']
答案 1 :(得分:0)
您还可以使用glom
,它对于深度嵌套的函数非常有用,并且有很多用途,可以简化复杂的嵌套任务。
例如翻译@Celius的答案:
glom(A, 'Tags.1.Value')
返回同一件事:
CodeDeploy_Ernie-dev-Autoscaling-Deploy_d-4WTRTRTRT
因此,要回答您要使用的原始问题:
glom(response, 'Reservations.0.Instances.0.Tags.1.Value')
答案 2 :(得分:0)
最终的代码是-
tags = response['Reservations'][0]['Instances'][0]['Tags']
autoscaling_name = next(t["Value"] for t in tags if t["Key"] == "aws:autoscaling:groupName")
这还确保如果将数据的顺序移入JSON数据中,它仍将找到正确的顺序。
答案 3 :(得分:0)
对于任何一个难以理解列表理解和迭代器的人,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"
键的所有值的列表。
对于您的问题,这可能有点过大,只需简单的列表理解即可轻松解决。但是,如果您以后需要做更复杂的事情,例如只匹配部分键(例如aws:*
或更复杂的东西,例如正则表达式),或者需要根据其中的值进行过滤,则此方法可能会派上用场嵌套对象的中间层。这种任务可能会导致大量复杂的嵌套循环或列表理解,而对于CherryPicker,它只是一个简单的可能单行的命令。
您可以在https://cherrypicker.readthedocs.io中找到有关高级用法的更多信息。