Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python操作JSON_Python_Json_Ansible - Fatal编程技术网

用python操作JSON

用python操作JSON,python,json,ansible,Python,Json,Ansible,我试图操纵JSON数据,以匹配Ansible的特定格式。我对python和一般编程都是新手。我似乎不太明白怎么做。这是我的相关代码: import os import sys import argparse import ConfigParser try: import json except ImportError: import simplejson as json import requests payload = 'query=SELECT+TOP+10+IPAdd

我试图操纵JSON数据,以匹配Ansible的特定格式。我对python和一般编程都是新手。我似乎不太明白怎么做。这是我的相关代码:

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 "\n\n"
        for item in hostsData['results']:
            print '' + item['Vendor']
            for item in hostsData['results']:
                print 'hosts:' + item['IPAddress']
这是我的输出:

./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
...
我要做的是输出类似于Ansible的内容:

{
    "Cisco"   : {
        "hosts"   : [ "10.150.190.2", "10.150.250.3" ],
            },
    "Unknown"  : 
        "hosts"   : [ "10.255.255.42" ],
},
谢谢你的帮助

CB

编辑:

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

这些是该服务器的真实凭据吗?URL是否真实??:ODude……….发布前对数据进行匿名………
10.0.0.0/24
是专用网络…问题是否与将一种结构转换为另一种结构有关?Dmitry,它是从测试环境中的Orion测试版本中提取的样本数据。还有RFC1918地址。我是编程新手,不是网络/秒。谢谢你的关心,明白了。我需要所有iPaddes都位于组下(供应商密钥)。这就是为什么我有这个循环。请注意下面的Cisco,然后在下面的主机键中输入所有IPAddress值。这就是ansible读取库存数据的方式。{“Cisco”:{“hosts”:[“10.150.190.2”,“10.150.250.3”],},“未知”:“hosts”:[“10.255.255.42”],},请尝试此^@FunkyClicker。已关闭。当我运行它时,我会在末尾得到一个空值,ansible不喜欢/swinds.py--列出{'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']},'未知':{'hosts':['10.255.255.42','10.33.93.3','10.33.93.6']}。我无法重现那个问题。当我执行一个包含我的确切代码的python文件时,我不会得到那个结果。这可能来自您原来的长字符串(我分配给's')。。。这里可能有空值吗?我的意思是,在最坏的情况下,您可以通过使用
pprint.pprint(eval(str(final_dict.replace('null','')))
来消除它,但我建议您在时间允许的情况下,从您这边找到它的来源。