2014-07-01 83 views
0

我對Python比較陌生,所以我一直在教自己。 我需要寫一個腳本解析JSON輸出,這看起來就像這樣:在Python中搜索複雜的數據結構

[{u'serverId': 117, u'hostName': u'bla', u'ipAddress': u'10.0.0.1', u'id': 163}, 
{u'serverId': 221, u'hostName': u'bla2', u'ipAddress': u'10.0.0.1', u'id': 380}, 
{u'serverId': 213, u'hostName': u'bla2', u'ipAddress': u'10.0.0.3', u'id': 658}] 

等等,等等...

我有一個主要數據來源,我迭代通過獲取主機名稱。 服務器ID需要輔助源(上圖)。

如何使用第一個數據源的主機名來獲取相應的ID?

提前致謝!

+0

這看起來像Python,而不是JSON。 – Ben

回答

0

你可以爲此如使用filter()一個班輪:

filter(lambda d: d['hostName'] == hostName, json.loads(data)) 

這將返回一個空的列表或數據的元素的列表(在字典形式)的量,主機密鑰等於hostName。您可以使用如下:

entries = filter(
    lambda d: d['hostName'] == hostName, 
    json.loads(data) 
) 

if not entries: 
    raise KeyError('There is no entry with that host name.') 

id = entries[0]['id'] 
+0

謝謝!這似乎工作。我喜歡這一個班輪的優雅:) – miitak

0

事情是這樣的:

my_list = [] 

# Read in json file 
with open('file.json') as in_file: 
    my_list = json.load(in_file) 

for row in my_list: # Loop through the array 
    if isinstance(row, dict): # Check we are dealing with a dictionary 
     if row.get('hostName', '') == 'bla': # compare values 
      print(row.get('id', None)) # Do something 
0

當你需要使用一個密鑰(在你的情況下,主機名)來查找另一塊的數據(在你的情況下,服務器ID),通常最Python中適當的數據結構是一本字典。在這種情況下,你會想建立一個字典,從您的JSON數據,這樣的事情:

server_id_mapping = {} 
for server_info in json.loads(data_source_2): 
    server_id_mapping[server_info['hostName']] = server_info['serverId'] 

然後,從主機獲取服務器ID,只需使用:

server_id = server_id_mapping[hostname]