2012-06-01 142 views
1

我無法弄清楚如何循環一個比1級更深的JSON對象。目的是:如何在Python中循環瀏覽JSON

{ 
    "data":[ 
    { 
     "id":"251228454889939/insights/page_fan_adds_unique/day", 
     "name":"page_fan_adds_unique", 
     "period":"day", 
     "values":[ 
     { 
      "value":9, 
      "end_time":"2012-05-29T07:00:00+0000" 
     }, 
     { 
      "value":5, 
      "end_time":"2012-05-30T07:00:00+0000" 
     } 
     ], 
     "title":"Daily New Likes", 
     "description":"Daily The number of new people who have liked your Page (Unique Users)" 
    }, 
    { 
     "id":"251228454889939/insights/page_fan_adds/day", 
     "name":"page_fan_adds", 
     "period":"day", 
     "values":[ 
     { 
      "value":9, 
      "end_time":"2012-05-29T07:00:00+0000" 
     }, 
     { 
      "value":5, 
      "end_time":"2012-05-30T07:00:00+0000" 
     } 
     ], 
     "title":"Daily New Likes", 
     "description":"Daily The number of new people who have liked your Page (Total Count)" 
    } 
    ] 
} 

代碼:

def parseJsonData(data): 
    output_json = json.loads(data) 
    for i in output_json: 
     print i 
     for k in output_json[i]: 
      print k 

爲什麼我不能訪問對象,如:output_json[data][id]? 我得到一個錯誤,如果我試試這個:

串指數之必須是整數

回答

2

你貼上什麼是無效的JSON。有一個無與倫比的[數據後]。

基於此,我猜測數據可能不是你想象的那樣。如果output_json [data]的值是一個列表,那麼您將無法訪問output_json[data][id]。相反,您必須執行類似output_json[data][0][id]的操作,其中[0]訪問列表中的第一項。

+0

進出口確保其OP的有效json,但是OP剛剛發佈了一片t他整件事 – jdi

+0

基於縮進和包圍,它看起來不像它。在頂部有一個開放的支架,顯然是由底部的一個支架關閉的,但是在這些支架之間,無與倫比的[發生。這可能是一個切片,但如果是這樣的話,這是一個不連續的或其他格式不正確的切片。 – BrenBarn

+0

你所要做的就是在最後一個'}之前添加一個結束''''。縮進並不重要。 – jdi

5

由於您的「數據」鍵實際上是對象列表,因此無法直接通過其「id」字段訪問項目。您將需要一個列表索引來訪問每個項目,如:現在
output_json["data"][0]["id"]

,如果你想要做的是能指數「數據」的成員通過「ID」字段作爲關鍵,你可以重新格式化您的數據:

# make "data" a dict {id: item, }, instead of list [item1, item2, ...] 
output_json['data'] = dict((item['id'], item) for item in json_data['data']) 

print output_json['data'] 
# {'251228454889939/insights/page_fan_adds_unique/day': ... 

print output_json['data']['251228454889939/insights/page_fan_adds_unique/day'] 
# {'description': 'Daily The number of new p ... 

# ways to loop over "data" 
for id_, item in output_json['data'].iteritems(): 
    print id_, item 

for item in output_json['data'].itervalues(): 
    print item 

否則,你所要做的就是在「數據」只循環,因爲在指數和物體之間沒有真正的關係:

for item in output_json["data"]: 
    print item['id'] 

# 251228454889939/insights/page_fan_adds_unique/day 
# 251228454889939/insights/page_fan_adds/day