2016-08-12 83 views
-1

好吧,所以我努力嘗試解析我的JSON對象一點點。 我的目標是抓住特定的JSON鍵並返回它的值。對於每個循環與JSON對象python

JSON文件

{ 
    "files": { 
    "resources": [ 
     { 
     "name": "filename", 
     "hash": "0x001" 
     }, 
     { 
     "name": "filename2", 
     "hash": "0x002" 
     } 
    ] 
    } 
} 

我已經開發了一個功能,讓我來分析上述

功能

def parsePatcher(): 
    url = '{0}/{1}'.format(downloadServer, patcherName) 
    patch = urllib2.urlopen(url) 
    data = json.loads(patch.read()) 
    patch.close() 
    return data 

好了,所以JSON的代碼,我現在想做一個foreach語句,打印出裏面的每個名字和散列對象。

foreach語句

for name, hash in patcher["files"]["resources"]: 
    print name 
    print hash 

但只打印出「名」和「散」而不是「文件名」和「0×001」

我在這裏幹什麼事不正確的?

+0

注意,JSON是*運輸格式*。一旦解析,你所擁有的就是Python對象。 –

回答

3

通過使用name, hash作爲for循環的目標,你是拆包字典:

>>> d = {"name": "filename", "hash": "0x001"} 
>>> name, hash = d 
>>> name 
'name' 
>>> hash 
'hash' 

這是因爲遍歷所有的字典只產生鍵:

>>> list(d) 
['name', 'hash'] 

和拆包用途迭代生成要分配給目標名稱的值。

即使在Python 3.3和更高版本的默認啓用哈希隨機化的情況下,這種工作方式仍然會隨機事件發生,這兩個密鑰的順序可能會相同。

只需使用一個名稱,分配字典,並在該詞典使用訂閱:

for resource in patcher["files"]["resources"]: 
    print resource['name'] 
    print resource['hash'] 
+0

謝謝。這是完美的解決方案! :) –

-2

的問題似乎是你有一個字典列表,第一獲取列表中的每個元素,然後要求元件(這是字典)用於鍵名和散列值

編輯:這是測試和工程

mydict = {"files": { "resources": [{ "name": "filename", "hash": "0x001"},{ "name": "filename2", "hash": "0x002"}]} } 

for element in mydict["files"]["resources"]: 
    for d in element: 
    print d, element[d] 
0

所以你打算做的是:

for dic in x["files"]["resources"]: 
    print dic['name'],dic['hash'] 

您需要遍歷在該陣列資源的字典。

-2

如果萬一你有多個文件和多個資源在裏面。這種廣義的解決方案有效。從myside

for keys in patcher: 
    for indices in patcher[keys].keys(): 
      print(patcher[keys][indices]) 

經過輸出

for keys in patcher: 
...  for indices in patcher[keys].keys(): 
...    print(patcher[keys][indices]) 
... 
[{'hash': '0x001', 'name': 'filename'}, {'hash': '0x002', 'name': 'filename2'}] 
+0

OOPS !!!原因??我從我的身邊.... –

+0

檢查啊,不,那會工作,但不會產生所需的輸出。 OP已經得到了這麼多,他們*已經有這個名單*。你創建的'補丁[「文件」] [「資源」]'表達的精心環版本,而不遍歷該列表。 –

+0

我不是說你的答案是錯的,我概括爲多個元素......對於循環應該使用... –