【问题标题】:How to select specific key/value of an object in json via python如何通过python在json中选择对象的特定键/值
【发布时间】:2019-06-05 22:02:40
【问题描述】:

我能够得到 api 请求的响应,并让它给我所有的细节。我解码 json response.json() 并使用 open() 和 json.dump 创建文件。我能够在列表中看到对象的所有键和值。接下来我想获取一个特定的键/值,以便我可以将它用作我的其他 python 脚本的输入。

我能够从 api 请求并解码 json 并通过 json.dump 创建 json 文件并列出所有对象。

我的python代码查询和创建json文件。

import requests
import json

#API request details
url = 'api url'
data = '{"service":"ssh", "user_id":"0", "action":"read_by_user", 
"user":"D2", "keyword":"NULL"}'
headers = {"Content-Type": "application/json"}

#Making http request
response = requests.post(url,data=data,headers=headers,verify=False)
print(response)

#Json string
json_disco = response.text
print(type(json_disco))
print(json_disco)

#Decode response.json() method to a python dictionary and use the data
device_disco = response.json()
print(type(device_disco))
print(device_disco)

with open('devices.json', 'w') as fp:
  json.dump(device_disco, fp, indent=4, sort_keys=True)

这是我使用netmiko模块访问设备的代码

with open('devices.json') as dev_file:
  devices = json.load(dev_file)
print(devices)

netmiko_exceptions = (netmiko.ssh_exception.NetMikoTimeoutException,
netmiko.ssh_exception.NetMikoAuthenticationException)

for device in devices['device']:
  try:
    print('~' * 79)
    print('Connecting to device:',device['ip'])
    connection = netmiko.ConnectHandler(**device)
    print(connection.send_command('show interfaces'))
    connection.disconnect()
  except netmiko_exceptions as e:
    print('Failed to ', device['ip'], e)

通过 ssh 访问数组 'device['ip'] 中的设备,这些设备引用包含登录名/ip/密码等所有详细信息的 json 文件。

来自 api 查询的 JSON 响应,响应的所有详细信息如下; 从此....

{
   "status": "SUCCESS",
   "device": [
         {
             "model":"XXXX-A",
             "username": "login1",
             "ip": "10.10.10.1",
             "password": "123",
             "device_type": "cisco_ios"
         },
         {
             "model":"XXXX-A",
             "username": "login2",
             "ip": "10.10.10.2",
             "password": "456",
             "device_type": "cisco_ios"
         },
         {
             "model":"XXXX-A",
             "username": "login3",
             "ip": "10.10.10.3",
             "password": "test",
             "device_type": "cisco_ios"
         }
    ]
}

我只想提取用户名、ip 和密码的键和值,并且仍然是下面的 json 格式。 对此……

{
      "status": "SUCCESS",
      "device": [
            {
                "username": "login1",
                "ip": "10.10.10.1",
                "password": "123"
            },
            {
                "username": "login2",
                "ip": "10.10.10.2",
                "password": "456"
            },
            {
                "username": "login3",
                "ip": "10.10.10.3",
                "password": "test"
            }
      ]
 }

我无法从每个对象中提取特定的键和值并以上述 json 列表格式打印。

如果我的其他帖子,这个问题是其中的一部分,但我将它作为一个单独的问题,因为该帖子已经得到回答,以避免任何混淆。我真的需要专家的帮助、支持和指导,我将不胜感激。谢谢

【问题讨论】:

    标签: python json api


    【解决方案1】:

    你可以像这样使用列表理解和字典:

    device_disco["device"] =[dict(username=k1["username"],password=k1["password"],ip=k1["ip"]) for k1 in 
    device_disco["device"]]
    
    jsonData = json.dumps(device_disco)
    print (jsonData)
    

    在您的代码中:

    import requests
    import json
    
    #API request details
    url = 'api url'
    data = '{"service":"ssh", "user_id":"0", "action":"read_by_user", 
    "user":"D2", "keyword":"NULL"}'
    headers = {"Content-Type": "application/json"}
    
    #Making http request
    response = requests.post(url,data=data,headers=headers,verify=False)
    print(response)
    
    #Json string
    json_disco = response.text
    print(type(json_disco))
    print(json_disco)
    
    #Decode response.json() method to a python dictionary and use the data
    device_disco = response.json()
    print(type(device_disco))
    print(device_disco)
    device_disco["device"] =[dict(username=k1["username"],password=k1["password"],ip=k1["ip"]) for k1 in 
    device_disco["device"]]
    
    jsonData = json.dumps(device_disco)
    
    
    with open('devices.json', 'w') as fp:
    json.dump(jsonData, fp, indent=4, sort_keys=True)
    

    【讨论】:

    • 您好,谢谢先生。 name/ip/etc 的详细信息是通过私有 api 获取的(我无法控制这个 api,我可以根据提供的 api 提出请求)并且内容可能会更改和更新。我可以获得所有详细信息,并希望从那里我可以修改我需要的键/值(这部分是我的问题)。此外,我需要的键/值应保持为 json 格式 {"device":[{},{},{}]}。
    • @chenoi 检查我编辑的答案,您只需将 jason 数据转换为 dict 然后执行此过程
    • 您好,先生,json 转换 json.loads() 不会列出我想要的键/值(用户名、IP、密码)......它将加载所有内容......
    • 将整个 json 数据加载到变量后,您可以使用我的代码
    • 来自 api 的数据调用可能会不时更改,因此我每次想要访问设备时都需要请求它以确保我获得最新的更新 ip/用户名/密码...我不能每次都必须在我的代码中硬编码 json 字符串...
    【解决方案2】:

    试试这个工作代码:

    import json
    import sys
    
    data={
       "status": "SUCCESS",
       "device": [
             {
                 "model":"XXXX-A",
                 "username": "login1",
                 "ip": "10.10.10.1",
                 "password": "123",
                 "device_type": "cisco_ios"
             },
             {
                 "model":"XXXX-A",
                 "username": "login2",
                 "ip": "10.10.10.2",
                 "password": "456",
                 "device_type": "cisco_ios"
             },
             {
                 "model":"XXXX-A",
                 "username": "login3",
                 "ip": "10.10.10.3",
                 "password": "test",
                 "device_type": "cisco_ios"
             }
        ]
    }
    json_str = json.dumps(data)
    resp = json.loads(json_str)
    print (resp['device'][0]['username'])
    

    【讨论】:

    • 您好,谢谢先生。我只需要列出的所有键中的几个键/值。
    • 这里是你的工作代码: import json import sys data={把你的 JSON 放在这里} json_str = json.dumps(data) resp = json.loads(json_str) print (resp['device '][0]['用户名'])
    【解决方案3】:
    print(json.dumps(json_object['defaultName'], sort_keys=True, indent=4)) 
    

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      相关资源
      最近更新 更多