2012-06-01 98 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