我确实有以下 JSON 对象 -
{
"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"
}
}
]
}
]
}
我正在寻找一些 JSON Traversal 来访问所有键并将上面转换为以下预期的 python 字典 -
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"
}
}
}
}
需要递归函数来获取资源和性能列表和数据以及自定义字典。
手工烹制的预期字典中可能存在拼写错误/语法错误...
到目前为止,这是我的代码-但是,对于 N 个嵌套资源,这失败了。
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