使用python(foursquare API)解析json文件中的较低级别?
问题描述:
因为我刚刚开始使用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'*lyn',
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文件的一部分去。
我知道必须有更好的方法来做到这一点,但我似乎无法找到一个简单的工作解决方案,所以任何帮助将非常感激。谢谢。
答
你需要循环items
:
for item in fs_checkin_data['response']['checkins']['items']:
venue = item['venue']
print venue['canonicalUrl'], venue['name']
checkins
仍然本身只有两个按键,items
和count
字典。循环遍历checkins
字典遍历密钥,因此在您的代码item
中设置为'count'
,然后'items'
(反之亦然)。另一方面,items
是词典的列表,因此循环显示该列表可让您访问每个单独的项目。
谢谢你这个简单的解决方案,我没有意识到我可以通过在for循环结尾添加'['items']'列表来简单地进入json响应的另一个层次(doh!)。 – JFC 2013-04-04 21:02:38