I have the following JSON object -
{ "Resource": [ { "@name": "Bravo", "@signature": "h#Bravo", "@type": "ESX_5.x", "@typeDisplayName": "ESX Server", "PerfList": { "@attrId": "cpuUsage", "@attrName": "Usage", "Data": [ { "@data": "26.00", "@end": "01:05:00", "@interval": "60", "@start": "01:04:00" }, { "@data": "24.00", "@end": "01:04:00", "@interval": "60", "@start": "01:03:00" }, { "@data": "36.00", "@end": "01:03:00", "@interval": "60", "@start": "01:02:00" }, { "@data": "38.00", "@end": "01:02:00", "@interval": "60", "@start": "01:01:00" }, { "@data": "37.00", "@end": "01:01:00", "@interval": "60", "@start": "01:00:00" } ] }, "Resource": [ { "@name": "Tango", "@signature": "vm#Tango", "@type": "vm", "@typeDisplayName": "Virtual Machine", "PerfList": { "@attrId": "cpuUsage", "@attrName": "Usage", "Data": { "@data": "12.00", "@end": "04:05:00", "@interval": "60", "@start": "04:04:00" } } }, { "@name": "Charlie", "@signature": "vm#Charlie", "@type": "vm", "@typeDisplayName": "Virtual Machine", "PerfList": { "@attrId": "cpuUsage", "@attrName": "Usage", "Data": [ { "@data": "12.00", "@end": "04:20:00", "@interval": "60", "@start": "04:19:00" }, { "@data": "12.00", "@end": "04:19:00", "@interval": "60", "@start": "04:18:00" } ] } } ] }, { "@name": "Alpha", "@signature": "h#Alpha", "@type": "ESX_5.x", "@typeDisplayName": "ESX Server", "PerfList": [ { "@attrId": "cpuUsage", "@attrName": "Usage", "Data": { "@data": "9", "@end": "06:10:00", "@interval": "60", "@start": "06:09:00" } }, { "@attrId": "cpuUsagemhz", "@attrName": "Usage MHz", "Data": { "@data": "479", "@end": "06:10:00", "@interval": "60", "@start": "06:09:00" } } ] } ] }
I am looking for several JSON Traversal to access all keys and convert above to the next expected python dictionary -
d = { 'ESX_5.x' : { 'Bravo' : { "@typeDisplayName" : "ESX Server", "@signature" : "h#Bravo", "cpuUsage" : { "from_01:04:00_to_01:05:00" : 26.00, "from_01:03:00_to_01:04:00" : 24.00, "from_01:02:00_to_01:03:00" : 36.00, "from_01:01:00_to_01:02:00" : 38.00, "from_01:00:00_to_01:01:00" : 37.00, "interval" : 60 }, "vm" : { "Tango" : { "@typeDisplayName" : "Virtual Machine", "@signature" : "vm#Tango", "cpuUsage" : { "from_04:04:00_to_04:05:00" : 12.00, "interval" : 60 } }, "Charlie" : { "@typeDisplayName" : "Virtual Machine", "@signature": "vm#Charlie", "cpuUsage" : { "from_04:19:00_to_04:20:00" : "12.00", "from_04:18:00_to_04:19:00" : "12.00", "@interval": "60", } } }, }, 'Alpha' : { "@typeDisplayName" : "ESX Server", "@signature" : "h#Alpha", "cpuUsage" : { "from_06:09:00_to_06:10:00" : 9, "@interval": "60" }, "cpuUsagemhz" : { "from_06:09:00_to_06:10:00" : 479, "@interval": "60" } } } }
You need recursive functions to extract resources and PerfList and data and a configuration dictionary.
There may be possible typos / syntax_errs in the expected manual dictionary ...
HERE IS MY CODE WHAT'S FURTHER - This, however, does not correspond to the N number of invested resources.
import json class MQLPrettyPrint(): KEY_RESPONSE = 'Response' KEY_RESULTS = 'Results' KEY_RESOURCE = 'Resource' def __init__(self,file=None): self._json_file = file self._json_data = self.read_json_file() self._json_dict = self.json_to_dict() def json_file(self): return self._json_file def read_json_file(self): json_data = "" try: JSON = open(self._json_file,"r") json_data = JSON.read() JSON.close() except: raise return json_data def json_to_dict(self): return json.loads(self._json_data) def json_data(self): return self._json_data def json_dict(self): return self._json_dict def json2mql(self): for key in self._json_dict: if key == self.KEY_RESPONSE: val = self._json_dict[key] response = self.fetch_response(val) def fetch_response(self,dict): for key in dict: if key == self.KEY_RESULTS: val = dict[key] results = self.fetch_results(val) def fetch_results(self,dict): for key in dict: if key == self.KEY_RESOURCE: val = dict[key] resource = self.fetch_resource(val) def fetch_resource(self,resources,dict={}): if isinstance(resources,list): for resource in resources: print "\n\n",resource if isinstance(resource,__builtins__.dict): #header = self.fetch_resource_header(resource) #perfList = self.fetch_perf_list(resource) self.fetch_resource(resource) elif isinstance(resources,dict): header = self.fetch_resource_header(resource) perfList = self.fetch_perf_list(resource) else: print resources def fetch_resouce_header(resource): name = resource['@name'] signature = resource['@signature'] type = resource['@type'] typeDisplayName = resource['@typeDisplayName'] resource_dict = {'@name' : name, '@signature' : signature, '@type' : type, '@typeDisplayName' : typeDisplayName} return resource_dict def fetch_perf_list(self,resource,perfDict={}): perfLists = resource['PerfList'] if isinstance(perfLists,list): for perf in perfLists: self.fetch_perf_list(perf,perfDict) elif isinstance(perfLists,dict): header = self.fetch_perf_header(perf) dataList = self.fetch_data(perf) key = "" if len(perfDict) == 0: key = header['@attrId'] perfDict[key] = header perfDict[key]['Data'] = dataList else: if not perfDict.has_key(key): perfDict[key] = header perfDict[key]['Data'] = dataList else: if perfDict.has_key('Data'): perfDict[key]['Data'].update(dataList) else: perfDict[key]['Data'] = dataList else: print perfLists return perfDict def fetch_perf_header(self,perfDict): header = {} attrID = perfDict['@attrId'] attrName = perfDict['@attrName'] header = {'@attrId' : attrID, '@attrName' : attrName} return header def fetch_data(self,perfDict,dataDict={}): dataList = perfDict['Data'] if isinstance(dataList,list): for data in dataList: #Fetch internal data self.fetch_data(data,dataDict) elif isinstance(dataList,dict): start = dataList['@start'] end = dataList['@end'] interval = dataList['@interval'] data = dataList['@data'] key = "%s_%s" % (start,end) dataDict[key] = dataList #data_dict = {key : dataList} #if len(dataDict) == 0: # dataDict[key] = data_dict #else: # dataDict['Data'].update(data_dict) else: print dataList return dataDict