簡體   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