/ / Manipulieren von JSON mit Python - Python, Json, ansible

Manipulieren Sie JSON mit Python - Python, JSON, ansible

Ich versuche, JSON-Daten zu manipulieren, um ein bestimmtes Format für Ansible anzupassen. Ich bin neu bei Python und Programmierung im Allgemeinen. Ich kann nicht wirklich herausfinden, wie das geht. Hier ist mein relevanter Code:

import os
import sys
import argparse
import ConfigParser

try:
import json
except ImportError:
import simplejson as json

import requests

payload = "query=SELECT+TOP+10+IPAddress,+Vendor+FROM+Orion.Nodes"
url = "https://10.150.199.44:17778/SolarWinds/InformationService/v3/Json/Query"
req = requests.get(url, params=payload, verify=False, auth=("dmitry", "security"))

jsonget = req.json()


def get_list(self):
hostsData = jsonget
print "Test json before manipulation:n"
print(hostsData)
print "nn"
for item in hostsData["results"]:
print "" + item["Vendor"]
for item in hostsData["results"]:
print "hosts:" + item["IPAddress"]

Das ist meine Ausgabe:

./swinds.py --list
Test json before manipulation:

{u"results": [{u"Vendor": u"Cisco", u"IPAddress": u"10.150.190.2"}, {u"Vendor": u"Cisco", u"IPAddress": u"10.150.250.3"}, {u"Vendor": u"Unknown", u"IPAddress": u"10.255.255.42"}, {u"Vendor": u"Juniper Networks/NetScreen", u"IPAddress": u"10.58.1.1"}, {u"Vendor": u"Cisco", u"IPAddress": u"10.33.93.1"}, {u"Vendor": u"Cisco", u"IPAddress": u"10.33.93.2"}, {u"Vendor": u"Unknown", u"IPAddress": u"10.33.93.3"}, {u"Vendor": u"Cisco", u"IPAddress": u"10.33.93.4"}, {u"Vendor": u"Unknown", u"IPAddress": u"10.33.93.6"}, {u"Vendor": u"Cisco", u"IPAddress": u"10.33.93.7"}]}



Cisco
hosts:10.150.190.2
hosts:10.150.250.3
hosts:10.255.255.42
hosts:10.58.1.1
hosts:10.33.93.1
hosts:10.33.93.2
hosts:10.33.93.3
hosts:10.33.93.4
hosts:10.33.93.6
hosts:10.33.93.7
Cisco
hosts:10.150.190.2
hosts:10.150.250.3
hosts:10.255.255.42
hosts:10.58.1.1
hosts:10.33.93.1
hosts:10.33.93.2
hosts:10.33.93.3
hosts:10.33.93.4
hosts:10.33.93.6
hosts:10.33.93.7
Unknown
...

Was ich versuche zu tun ist so etwas wie Ansible auszugeben:

{
"Cisco"   : {
"hosts"   : [ "10.150.190.2", "10.150.250.3" ],
},
"Unknown"  :
"hosts"   : [ "10.255.255.42" ],
},

Danke für jede Hilfe.

CB

Antworten:

0 für die Antwort № 1

BEARBEITET:

import pprint
import simplejson

# Your long string
s = {u"results": [{u"Vendor": u"Cisco", u"IPAddress": u"10.150.190.2"}, {u"Vendor": u"Cisco", u"IPAddress": u"10.150.250.3"}, {u"Vendor": u"Unknown", u"IPAddress": u"10.255.255.42"}, {u"Vendor": u"Juniper Networks/NetScreen", u"IPAddress": u"10.58.1.1"}, {u"Vendor": u"Cisco", u"IPAddress": u"10.33.93.1"}, {u"Vendor": u"Cisco", u"IPAddress": u"10.33.93.2"}, {u"Vendor": u"Unknown", u"IPAddress": u"10.33.93.3"}, {u"Vendor": u"Cisco", u"IPAddress": u"10.33.93.4"}, {u"Vendor": u"Unknown", u"IPAddress": u"10.33.93.6"}, {u"Vendor": u"Cisco", u"IPAddress": u"10.33.93.7"}]}



# Eval the Json to python friendly dict
dumped = eval(simplejson.dumps(s))

# Make a set of vendors (no duplicates)
vendor_set = set()
for value in dumped["results"]:
vendor_set.add(value["Vendor"])

# Make a new dict based on these vendors
final_dict = dict.fromkeys(vendor_set)

# Loop over the dict, conditionally adding IPAddresses to the hosts key for each vendor
for key in final_dict:
for v in dumped["results"]:
if final_dict[key] is not None:
if key in str(v):
final_dict[key]["hosts"].append(v["IPAddress"])
else:
final_dict[key] = {"hosts": []}

# Print it (somewhat) nicely
pprint.pprint(final_dict)

# Prints:
{"Cisco": {"hosts": ["10.150.250.3",
"10.33.93.1",
"10.33.93.2",
"10.33.93.4",
"10.33.93.7"]},
"Juniper Networks/NetScreen": {"hosts": ["10.58.1.1"]},
"Unknown": {"hosts": ["10.255.255.42", "10.33.93.3", "10.33.93.6"]}}