如何在Python中从API json响应中获取特定数据

如何在Python中从API json响应中获取特定数据,python,json,api,Python,Json,Api,我是一名网络工程师,对网络自动化非常感兴趣。我是用python实现自动化的初学者 我最近编写了一段代码,向一台设备发送GETAPI查询,并获取网络对象的详细信息,它为我提供了很多我实际上并不需要的信息 我想知道如何从json响应中解析或获取特定数据 例如,从以下响应中: {'links': {'self': 'https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b6

我是一名网络工程师,对网络自动化非常感兴趣。我是用python实现自动化的初学者

我最近编写了一段代码,向一台设备发送GETAPI查询,并获取网络对象的详细信息,它为我提供了很多我实际上并不需要的信息

我想知道如何从json响应中解析或获取特定数据

例如,从以下响应中:

{'links': {'self': 'https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networks?offset=0&limit=25&expanded=true'}, 'items': [{'links': {'self': 'https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networks/005056BB-0B24-0ed3-0000-893353264061', 'parent': 'https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networkaddresses'}, 'type': 'Network', 'value': '10.0.0.0/8', 'overridable': True, 'description': 'test api put wih postman ', 'id': '005056BB-0B24-0ed3-0000-893353264061', 'name': '10.0.0.0_8', 'metadata': {'timestamp': 1602974037876, 'lastUser': {'name': 'akankshu_a'}, 'domain': {'name': 'Global', 'id': 'e276abec-e0f2-11e3-8169-6d9ed49b625f'}, 'ipType': 'V_4', 'parentType': 'NetworkAddress'}}, {'links': {'self': 'https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networks/005056BB-0B24-0ed3-0000-893353272647', 'parent': 'https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networkaddresses'}, 'type': 'Network', 'value': '10.10.210.0/24', 'overridable': False, 'description': ' ', 'id': '005056BB-0B24-0ed3-0000-893353272647', 'name': '10.10.210.0_24', 'metadata': {'timestamp': 1598427295586, 'lastUser': {'name': 'akankshu_a'}, 'domain': {'name': 'Global', 'id': 'e276abec-e0f2-11e3-8169-6d9ed49b625f'}, 'ipType': 'V_4', 'parentType': 'NetworkAddress'}}
我只想取这个:

'type': 'Network', 'value': '10.10.210.0/24', 'overridable': False, 'description': ' ', 'name': '10.10.210.0_24'
请帮忙

问候 阿肯舒

附加评论:

我已使用以下代码获取所需的结果:

嗨,比尔,我做了以下工作以获得所需的输出,但是,我需要知道如何将其格式化回json,以便我可以发布方法,通过API将其推送到设备………导入json

数据_txt=“” {“链接”:{“自我”:https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networks?offset=0&limit=25&expanded=true},“项”:[{“链接”:{“自身”:https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networks/005056BB-0B24-0ed3-0000-893353264061,“父项”:https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networkaddresses“},”键入“:”网络“,”值“:”10.0.0/8“,”可重写“:”真“,”描述“:”测试api与邮差“,”id“:”005056BB-0B24-0ed3-0000-893353264061“,”名称“:”10.0.0.08“,”元数据“:{”时间戳“:1602974037876,“lastUser”:{“name”:“akankshu_a”},“domain”:{“name”:“Global”,“id”:“e276abec-e0f2-11e3-8169-6d9ed49b625f”},“ipType”:“V_4”,“parentype”:“NetworkAddress”},{“links”:{“self”:"https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networks/005056BB-0B24-0ed3-0000-893353272647,“父项”:https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networkaddresses“}”,类型:“网络”,“值”:“10.10.210.0/24”,“可重写”“:”False“,”description“:”id“:”005056BB-0B24-0ed3-0000-893353272647“,”名称“:”10.10.210.0徖24“,”元数据“{”时间戳“:”1598427295586,“最后用户“,”名称“:”akankshu a“,”域“:{”名称“:”全局“,”id“:”e276abec-e0f2-11e3-8169-6d9ed49b625f“,”ipType“,”V徖4“,”父类型“:”网络地址“}” “”“

json_obj=json.loads(数据_txt)

json_obj.pop('links')

items=json_obj

pop_项=['links','id','metadata'] 对于pop_项目中的val: 对于范围(0,2)内的val2: json_obj['items'][val2].pop(val) 打印(json_obj['items'])


但是,我想知道如何将其转换为json格式,以便使用API POST方法将其推送到另一个设备。

首先,您可以使用类似的工具来确保json格式正确,以便进行解析。这在这里发布时很有帮助,因为它为人们提供了一个可重复的示例

完成后,您可以使用Python内置的
json
模块将json文本解析为可以导航的对象

import json

data_txt = """
{"links": {"self": "https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networks?offset=0&limit=25&expanded=true"}, "items": [{"links": {"self": "https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networks/005056BB-0B24-0ed3-0000-893353264061", "parent": "https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networkaddresses"}, "type": "Network", "value": "10.0.0.0/8", "overridable": "True", "description": "test api put wih postman ", "id": "005056BB-0B24-0ed3-0000-893353264061", "name": "10.0.0.0_8", "metadata": {"timestamp": 1602974037876, "lastUser": {"name": "akankshu_a"}, "domain": {"name": "Global", "id": "e276abec-e0f2-11e3-8169-6d9ed49b625f"}, "ipType": "V_4", "parentType": "NetworkAddress"}}, {"links": {"self": "https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networks/005056BB-0B24-0ed3-0000-893353272647", "parent": "https://fmcrestapisandbox.cisco.com/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/networkaddresses"}, "type": "Network", "value": "10.10.210.0/24", "overridable": "False", "description": " ", "id": "005056BB-0B24-0ed3-0000-893353272647", "name": "10.10.210.0_24", "metadata": {"timestamp": 1598427295586, "lastUser": {"name": "akankshu_a"}, "domain": {"name": "Global", "id": "e276abec-e0f2-11e3-8169-6d9ed49b625f"}, "ipType": "V_4", "parentType": "NetworkAddress"}}]}
"""

json_obj = json.loads(data_txt)
现在您有了一个包含“链接”部分和“项目”部分的对象。您可以跳过这些链接,因为您要查找的所有信息都在项目中

items = json_obj["items"]
从这里,您可以使用索引直接访问所需的项目,也可以循环访问项目列表以从所有(两者)项目中获取信息


你可以参考这篇文章,因为你的示例响应格式不正确。请解决这个问题。嗨,比尔,谢谢你的精彩解释,但是我想知道在Json解析器中使用哪个选项(字符串解析或JS eval)?另外,我想知道如何以字典格式获取数据,以便使用“POST”“方法将其推送到其他类似设备嗨,伙计们,感谢所有的帮助。最后,我找到了让一切顺利的方法,不过,谢谢你让我走上了正确的道路。干杯
item = items[1] # just get the second item

# loop over all of the items
for item in items:
    print("Type:", item["type"])
    print("Value:", item["value"])
    print("Overridable:", item["overridable"])
    print("Description:", item["description"])
    print("Name:", item["name"])