【问题标题】:How to extract nested JSON data?如何提取嵌套的 JSON 数据?
【发布时间】:2019-09-10 16:54:27
【问题描述】:

我正在尝试从数据 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"

【问题讨论】:

  • autoscaling_name = response['Reservations'][0]['Instances'][0]['Tags'][1][1]
  • 只是想知道为什么人们在这方面给我负面评价?我是初学者,在发布问题之前做了一些研究——我希望现在可以帮助其他人。你还记得你刚开始没有人可以依靠的时候吗?!对于初学者来说,这是一个很好的资源 - 保持这种状态。
  • 另请参阅: Can we be nicer to new users? 欢迎使用 Stackoverflow,祝您学习顺利。

标签: python json


【解决方案1】:

这是完整的输出吗?这是一个包含嵌套字典列表的字典,所以你应该这样对待它。假设它被称为:

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']

【讨论】:

  • 成功了。现在我了解了如何深入研究 JSON。谢谢!
【解决方案2】:

您也可以使用glom,它非常适合深度嵌套的函数,并且有很多用途可以让复杂的嵌套任务变得简单。

例如翻译@Celius的回答:

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

返回相同的东西:

CodeDeploy_Ernie-dev-Autoscaling-Deploy_d-4WTRTRTRT

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

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

【讨论】:

  • glom 看起来确实更容易。感谢您的建议!
【解决方案3】:

这个的最终代码是 -

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

这也确保了如果在 JSON 数据中移动了数据的顺序,它仍然会找到正确的顺序。

【讨论】:

    【解决方案4】:

    对于任何难以理解列表推导和迭代器的人,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:* 或更复杂的东西,如正则表达式),或者您需要根据中间值进行过滤,这种方法可能会派上用场嵌套对象的层。这类任务可能会导致大量复杂的嵌套 for 循环或列表解析,而对于 CherryPicker,它仍然是一个简单的、可能是单行命令。

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

    【讨论】:

      猜你喜欢
      • 2020-10-24
      • 2021-10-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2019-10-06
      相关资源
      最近更新 更多