0
votes

Comment sélectionner une clé / valeur spécifique d'un objet dans json via python

Je suis en mesure d'obtenir une réponse à la demande de l'API et de me donner tous les détails. Je décode le json response.json () et crée le fichier avec open () et json.dump. Je peux voir toutes les clés et valeurs de l'objet dans la liste. Ensuite, je voudrais obtenir une clé / valeur spécifique afin de pouvoir l'utiliser comme entrée dans mon autre script python.

Je suis capable de demander à l'API et de décoder le json et de créer un fichier json via json.dump et de tout lister des objets.

Mon code python pour interroger et créer le fichier 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"
            }
      ]
 }

C'est le code que j'utilise le module netmiko pour accéder à l'équipement

{
   "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"
         }
    ]
}

Pour accéder à ssh aux périphériques du tableau 'device [' ip '] qui renvoient au fichier json contenant tous les détails tels que le nom de connexion / ip / mot de passe.

Réponse JSON de la requête API qui répond à tous les détails ci-dessous; À PARTIR DE CECI ....

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)

Je souhaite extraire uniquement la clé et la valeur du nom d'utilisateur, de l'adresse IP et du mot de passe et toujours au format json ci-dessous. POUR CECI ....

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)

Je ne suis pas en mesure d'extraire des clés et des valeurs spécifiques de chaque objet et de les imprimer au format de liste json comme ci-dessus.

Cette question fait partie de l'un de mes autres messages, mais j'en ai fait une question distincte car ce message a déjà été répondu et pour éviter toute confusion. J'ai vraiment besoin de l'aide d'un expert, le soutien et les conseils seraient très appréciés. Merci


0 commentaires

3 Réponses :


0
votes

Essayez ce code de travail:

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


2 commentaires

Salut merci monsieur. J'ai juste besoin de quelques clés / valeurs de toutes les clés répertoriées.


Voici le code de travail pour vous: import json import sys data = {mettez votre JSON ici} json_str = json.dumps (data) resp = json.loads (json_str) print (resp ['device'] [0] ['username '])



1
votes

Vous pouvez utiliser la compréhension de liste et la dictée comme ceci:

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)

dans votre code:

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)


9 commentaires

Salut merci monsieur. Les détails de name / ip / etc sont obtenus via une API privée (je n'ai aucun contrôle sur cette API et je peux faire ma demande en fonction de l'API fournie) et le contenu peut être modifié et mis à jour. Je peux obtenir tous les détails et à partir de là, j'espère pouvoir modifier la clé / valeur dont j'ai besoin (cette partie est mon problème). De plus, la clé / valeur dont j'ai besoin doit être conservée au format json {"device": [{}, {}, {}]}.


@chenoi vérifie ma réponse modifiée, il vous suffit de convertir les données jason en dict, puis de faire le processus


Salut monsieur le json convert json.loads () ne listera pas les clés / valeurs (nom d'utilisateur, ip, mot de passe) que je veux .... il chargera tout ..


Après avoir chargé toutes les données json dans la variable, vous pouvez utiliser mon code


l'appel de données de l'API peut être modifié de temps en temps, donc je dois le demander chaque fois que je veux accéder aux appareils pour m'assurer d'obtenir la dernière mise à jour ip / nom d'utilisateur / mot de passe ... je ne peux pas à chaque fois avoir à coder en dur le json string dans mon code ...


est vos données json dans device_disco?


Ça a l'air bien ... je vais le simuler et l'exécuter pour être vérifié plus loin. Merci


Oui monsieur. Ça marche. Merci pour votre attention et votre bon soutien.


@chenoi heureux de pouvoir aider.



-1
votes
print(json.dumps(json_object['defaultName'], sort_keys=True, indent=4)) 

0 commentaires