/ / Manipulovať s JSON s pythónom - python, json, ansible

Manipulujte s JSON s python - python, json, ansible

Snažím sa manipulovať s údajmi JSON tak, aby zodpovedali konkrétnemu formátu pre Ansible. Som nový program pre Python a programovanie všeobecne. Zdá sa, že nedokážem prísť na to, ako to urobiť. Tu je môj príslušný kód:

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

Toto je môj výstup:

./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
...

Čo sa snažím urobiť, je výstup niečoho ako je tento.

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

Ďakujeme za pomoc.

CB

odpovede:

0 pre odpoveď č. 1

upravené:

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