如何使用 Python 打印嵌套的 JSON 数据?

How to print nested JSON data using Python?

提问人:Dragon 提问时间:9/27/2023 更新时间:9/27/2023 访问量:109

问:

我刚开始编程。我正在尝试使用 Python 脚本打印一些嵌套的 JSON 数据。

下面是 JSON 的示例:

{
"objects": [
        {
            "id": "1",
            "spec_version": "2.1",
            "type": "green",
            "extensions": {
                "extension-definition--ea279b3e-5c71-4632-ac08-831c66a786ba": {
                    "extension_type": "purple",
                    "id": "2",
                    "type": "yellow",
                    "created_at": "2023-09-26",
                    "updated_at": "2023-09-26",
                    "stix_ids": [
                        "3"
                    ],
                }
            }
       }
   ]
}

如果我必须在“扩展名”中打印类似“extension_type”的内容,我该怎么做? 我的 Python 脚本:

import json, requests 

url = "myUrl"

payload = {}
headers = {
  'Authorization': 'Auth',
  'Cookie': 'biscuit'
}

response = requests.request("GET", url, headers=headers, data=payload)
my_json = json.loads(response.text)

for data in my_json['objects'][0]['extensions']:
    print(data)

输出是:我只能走到这一步,我不知道如何访问“extension_type”并打印它。extension-definition--ea279b3e-5c71-4632-ac08-831c66a786ba

python json python-requests 嵌套

评论

0赞 Codist 9/27/2023
objects 键有一个列表来表示其值。这意味着该列表中可能有多个元素 - 否则为什么它会是一个列表?你打算如何处理这个问题?

答:

0赞 Muhammad Shamshad Aslam 9/27/2023 #1
data = {
"objects": [
        {
            "id": "1",
            "spec_version": "2.1",
            "type": "green",
            "extensions": {
                "extension-definition--ea279b3e-5c71-4632-ac08-831c66a786ba": {
                    "extension_type": "purple",
                    "id": "2",
                    "type": "yellow",
                    "created_at": "2023-09-26",
                    "updated_at": "2023-09-26",
                    "stix_ids": [
                        "3"
                    ],
                }
            }
       }
   ]
}

您可以使用以下代码访问数据:extension_type

data["objects"][0]["extensions"]["extension-definition--ea279b3e-5c71-4632-ac08-831c66a786ba"]["extension_type"]

评论

0赞 Dragon 9/27/2023
你好,它有效!谢谢你:)你知道它垂直打印数据的原因吗?像这样的东西:p u r p l e
0赞 Muhammad Shamshad Aslam 9/27/2023
因为你正在循环浏览一个字符串。所以你的循环是这样的:对于“紫色”的数据。无需循环即可获取此值。
0赞 Dragon 9/27/2023
哦,好的,谢谢你,祝你有美好的一天^^
1赞 Nick 9/27/2023 #2

我假设你知道这些键,但下一个键是动态的,你不知道。在这种情况下,您可以按照以下过程获取值:extensionsextension_type

由于是字典,因此您可以使用以下命令在字典中找到第一个(在本例中仅)值:my_json['objects'][0]['extensions']

ext = next(iter(my_json['objects'][0]['extensions'].values()))

然后简单地获取扩展:

ext_type = ext['extension_type']

输出:

'purple'
0赞 Codist 9/27/2023 #3

另一种方法(适用于本问题中的数据结构)是执行递归搜索,只寻找感兴趣的密钥 - 无论它可能在哪里。

例如:

def search(d, key):
    def _search(e):
        nonlocal key
        if isinstance(e, dict):
            if key in e:
                return e[key]
            for v in e.values():
                if (r := _search(v)) is not None:
                    return r
        elif isinstance(e, (list, tuple, set)):
            for v in e:
                if (r := _search(v)) is not None:
                    return r
    return _search(d)


data = {
    "objects": [
        {
            "id": "1",
            "spec_version": "2.1",
            "type": "green",
            "extensions": {
                "extension-definition--ea279b3e-5c71-4632-ac08-831c66a786ba": {
                    "extension_type": 'purple',
                    "id": "2",
                    "type": "yellow",
                    "created_at": "2023-09-26",
                    "updated_at": "2023-09-26",
                    "stix_ids": ["3"],
                }
            },
        }
    ]
}

print(search(data, 'extension_type'))

输出:

purple