2

私はPythonを使い始めたばかりなので、json応答を解析するという概念をまだよく理解していないと思います.jsonファイルの特定の部分だけを印刷しようとすると、同じ問題が発生し続けます. 以下のコードでは、foursquare checkins API エンドポイントを使用してチェックイン履歴を返しています (簡潔にするために認証プロセスは省略しています)。

    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}}]}}}

ネストされた'canonicalUrl'andを解析して、構造が次のようになることを理解したいだけです。'name''venue'

    response
       checkins
          items
             venue
                canonicalUrl                 
                name

ループしてブロブを空のリストfs_checkin_data['response']['checkins']に追加しようとしました:'items'

    items = []

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

次に、その空のリストを for ループして blob を別の空のリストに追加し、最終的にand'venue'のみを出力できると考えています(わからないので即興で作っていたので、醜いハッキングされたロジックをお詫びします同じ結果を達成する別の方法)。'canonicalUrl''name'

ただし、上記のコードでは次のエラーが発生しました。

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

私が理解していないときから

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

json ファイルのその部分を通過しても問題はありません。

これを行うためのより良い方法が必要であることはわかっていますが、簡単で実用的な解決策を見つけることができないようですので、どんな助けも大歓迎です。ありがとうございました。

4

1 に答える 1

1

ループする必要がありますitems

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

checkinsはまだ 2 つのキーのみを持つ辞書であり、itemscount. 辞書をループするcheckinsとキーが反復されるため、コードitemでは が に設定され'count'、その後'items'(またはその逆) に設定されます。items一方、 は辞書のリストであるため、そのリストをループすると、個々の項目にアクセスできます。

于 2013-04-04T20:36:20.293 に答える