2013-04-04 81 views
2

因为我刚刚开始使用python,我不认为我已经很好地理解了解析json响应的概念,并且在尝试仅打印出json文件的某些部分时仍然遇到同样的问题。在下面的代码,我使用的是四方签入API端点给我回签入历史(略去了在auth过程):使用python(foursquare API)解析json文件中的较低级别?

from rauth import OAuth2Service 
    import json 
    import pprint 

    fs_checkins = session.get(endpoint, params = query_params) 
    fs_checkin_data = json.loads(fs_checkins.content) 

    pprint.pprint(fs_checkin_data) 

这导致了看起来像一个JSON响应:

{u'response': {u'checkins': {u'count': 74, 
           u'items': [{u'photos': {u'count': 0, 
                 u'items': []}, 
              u'posts': {u'count': 0, 
                 u'textCount': 0}, 
              u'source': {u'name': u'foursquare for iPhone', 
                 u'url': u'https://foursquare.com/download/#/iphone'}, 
              u'timeZoneOffset': -240, 
              u'type': u'checkin', 
              u'venue': {u'beenHere': {u'count': 1, 
                     u'marked': False}, 
                 u'canonicalUrl': u'https://foursquare.com/v/nitehawk-cinema/4da491f6593f8eec9a257e35', 
                 u'categories': [{u'icon': {u'prefix': u'https://foursquare.com/img/categories_v2/arts_entertainment/movietheater_', 
                        u'suffix': u'.png'}, 
                     u'id': u'4bf58dd8d48988d17f941735', 
                     u'name': u'Movie Theater', 
                     u'pluralName': u'Movie Theaters', 
                     u'primary': True, 
                     u'shortName': u'Movie Theater'}], 
                 u'contact': {u'formattedPhone': u'(718) 384-3980', 
                    u'phone': u'7183843980'}, 
                 u'id': u'4da491f6593f8eec9a257e35', 
                 u'like': False, 
                 u'likes': {u'count': 114, 
                    u'groups': [{u'count': 114, 
                       u'items': [], 
                       u'type': u'others'}], 
                    u'summary': u'114 likes'}, 
                 u'location': {u'address': u'136 Metropolitan Ave.', 
                     u'cc': u'US', 
                     u'city': u'Brooklyn', 
                     u'country': u'United States', 
                     u'crossStreet': u'btwn Berry St. & Wythe Ave.', 
                     u'lat': 40.716219932353624, 
                     u'lng': -73.96228637176877, 
                     u'postalCode': u'11211', 
                     u'state': u'NY'}, 
                 u'name': u'Nitehawk Cinema', 
                 u'stats': {u'checkinsCount': 11566, 
                    u'tipCount': 99, 
                    u'usersCount': 6003}, 
                 u'url': u'http://www.nitehawkcinema.com', 
                 u'venuePage': {u'id': u'49722288'}, 
                 u'verified': True}}]}}} 

我只是想分析出'venue'下筑巢'canonicalUrl''name'和理解结构是像这样:

response 
     checkins 
      items 
      venue 
       canonicalUrl     
       name 

我试图通过fs_checkin_data['response']['checkins']循环到'items' BLOB追加到一个空表:

items = [] 

    for item in fs_checkin_data['response']['checkins']: 
     info = {} 
     info['items'] = item['items'] 
     items.append(info) 

想我会再能用于环路直通空单的'venue' BLOB追加到另一个空单最后只能打印出'canonicalUrl''name'(对于丑陋的黑客入侵逻辑,我正在即兴发表道歉,因为我不知道获得相同结果的另一种方式)。

然而,上面的代码导致此错误:

  info['items'] = item['items'] 
    TypeError: string indices must be integers 

我不理解,因为当我做

for item in fs_checkin_data['response']['checkins']: 
     pprint.pprint(item) 

没有问题,通过JSON文件的一部分去。

我知道必须有更好的方法来做到这一点,但我似乎无法找到一个简单的工作解决方案,所以任何帮助将非常感激。谢谢。

回答

1

你需要循环items

for item in fs_checkin_data['response']['checkins']['items']: 
    venue = item['venue'] 
    print venue['canonicalUrl'], venue['name'] 

checkins仍然本身只有两个按键,itemscount字典。循环遍历checkins字典遍历密钥,因此在您的代码item中设置为'count',然后'items'(反之亦然)。另一方面,items是词典的列表,因此循环显示该列表可让您访问每个单独的项目。

+0

谢谢你这个简单的解决方案,我没有意识到我可以通过在for循环结尾添加'['items']'列表来简单地进入json响应的另一个层次(doh!)。 – JFC 2013-04-04 21:02:38