2017-08-31 248 views
2

我有一個如下所示的JSON對象。其實巨大的JSON文件,簡化來問這個問題。嵌套字典中的訪問鍵python

"header": { 
     "headerAttributes": { 
      "pageCount": 5, 
      "totalCount": 5 
     } 
    }, 
"payload": [ 
    { 
     "firstKey": [ 
       { 
        "nestedKey_1": "1", 
        "nestedKey_2": "2" 
       }, 
       { 
        "nestedKey_3": "3", 
        "nestedKey_4": "4" 
       } 
      ] 
    } 
] 

現在我寫下了python代碼來訪問[]中的值。

Total_Orders_Count = json_response ['header']['headerAttributes']['totalCount'] 
for i in range(0,Total_Orders_Count): 
      dict = json_response ['payload'][i] 
      inner_dict = dict ['firstKey'] [0] 
      print inner_dict ['nestedKey_1'] + '(' + inner_dict['nestedKey_2'] + ')' 

上面的代碼工作正常。但是,dict ['firstKey'] [0]的使用不適用於大於1的值。

有兩個問題。 1.是否有更好的方法來訪問[]中的鍵值。 2.我們可以在[]中找到數值的長度。對於此列表,「firstKey」下的值長度爲2.

任何幫助表示讚賞。

+0

「字典的使用[‘firstKey’] [0]不工作對於超過1「的值?你什麼意思? –

+1

也不叫你的變量'字典' –

+0

'len(json_response ['payload'] [i] ['firstKey'])' – Barmar

回答

2

只是在列表上直接循環。沒有必要知道一個長度達陣:

for d in json_response ['payload']: 
    for inner_dict in d['firstKey']: 
     print '{0[nestedKey_1]}({0]nestedKey_2})'.format(inner_dict) 

for <name> in <listobject>環是for each construct;沒有索引產生。相反,循環將列表中的每個元素分配給目標名稱。

我將名稱dict更改爲d以避免掩蓋內置類型。我還使用string formatting將內部字典中的值放入字符串中。

請注意,我完全刪除了totalCount密鑰。這裏沒有必要看這個價值。

至於查找列表的長度,只需使用len() function。同樣,不需要使用該功能這裏,迭代直接在列表上去除了預先生成索引的需要。

0

在您提供的JSON中,淨荷外部列表中只有一個元素。但代碼嘗試訪問該列表中前五個不存在的元素。

儘量避免直接訪問列表中的值,例如di['key'],除非您確定它存在,否則請使用'di.get('key','default')`。

要循環通過鍵值和獲得的值的長度下「firstKey」,使用以下代碼:

for payload in json_response.get('payload',[]) : 
    # Length of values under firstKey 
    print(len(payload.get('firstKey',[]))) 
    # To access nested Keys 
    for i in payload.get('firstKey',[]) : 
     for k,v in i.items() : 
      print(k,':',v)