2017-03-20 215 views
2

我试图解析来自Foursquare的JSON响应。它的嵌套方式我无法弄清楚。 Here's a copy of the entire JSON从Foursquare API解析嵌套的JSON

这里的JSON的一个片段:

{ 
"meta": { 
    "code": 200, 
    "requestId": "58cab8bc4434b959e2f68a69" 
}, 
"response": { 
    "categories": [ 
     { 
      "categories": [ 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/default_", 
         "suffix": ".png" 
        }, 
        "id": "56aa371be4b08b9a8d5734db", 
        "name": "Amphitheater", 
        "pluralName": "Amphitheaters", 
        "shortName": "Amphitheater" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/aquarium_", 
         "suffix": ".png" 
        }, 
        "id": "4fceea171983d5d06c3e9823", 
        "name": "Aquarium", 
        "pluralName": "Aquariums", 
        "shortName": "Aquarium" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/arcade_", 
         "suffix": ".png" 
        }, 
        "id": "4bf58dd8d48988d1e1931735", 
        "name": "Arcade", 
        "pluralName": "Arcades", 
        "shortName": "Arcade" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/artgallery_", 
         "suffix": ".png" 
        }, 
        "id": "4bf58dd8d48988d1e2931735", 
        "name": "Art Gallery", 
        "pluralName": "Art Galleries", 
        "shortName": "Art Gallery" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/bowling_", 
         "suffix": ".png" 
        }, 
        "id": "4bf58dd8d48988d1e4931735", 
        "name": "Bowling Alley", 
        "pluralName": "Bowling Alleys", 
        "shortName": "Bowling Alley" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/casino_", 
         "suffix": ".png" 
        }, 
        "id": "4bf58dd8d48988d17c941735", 
        "name": "Casino", 
        "pluralName": "Casinos", 
        "shortName": "Casino" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/default_", 
         "suffix": ".png" 
        }, 
        "id": "52e81612bcbc57f1066b79e7", 
        "name": "Circus", 
        "pluralName": "Circuses", 
        "shortName": "Circus" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/comedyclub_", 
         "suffix": ".png" 
        }, 
        "id": "4bf58dd8d48988d18e941735", 
        "name": "Comedy Club", 
        "pluralName": "Comedy Clubs", 
        "shortName": "Comedy Club" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/musicvenue_", 
         "suffix": ".png" 
        }, 
        "id": "5032792091d4c4b30a586d5c", 
        "name": "Concert Hall", 
        "pluralName": "Concert Halls", 
        "shortName": "Concert Hall" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/performingarts_dancestudio_", 
         "suffix": ".png" 
        }, 
        "id": "52e81612bcbc57f1066b79ef", 
        "name": "Country Dance Club", 
        "pluralName": "Country Dance Clubs", 
        "shortName": "Country Dance Club" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/default_", 
         "suffix": ".png" 
        }, 
        "id": "52e81612bcbc57f1066b79e8", 
        "name": "Disc Golf", 
        "pluralName": "Disc Golf Courses", 
        "shortName": "Disc Golf" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/default_", 
         "suffix": ".png" 
        }, 
        "id": "56aa371be4b08b9a8d573532", 
        "name": "Exhibit", 
        "pluralName": "Exhibits", 
        "shortName": "Exhibit" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/default_", 
         "suffix": ".png" 
        }, 
        "id": "4bf58dd8d48988d1f1931735", 
        "name": "General Entertainment", 
        "pluralName": "General Entertainment", 
        "shortName": "Entertainment" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/racetrack_", 
         "suffix": ".png" 
        }, 
        "id": "52e81612bcbc57f1066b79ea", 
        "name": "Go Kart Track", 
        "pluralName": "Go Kart Tracks", 
        "shortName": "Go Kart" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/historicsite_", 
         "suffix": ".png" 
        }, 
        "id": "4deefb944765f83613cdba6e", 
        "name": "Historic Site", 
        "pluralName": "Historic Sites", 
        "shortName": "Historic Site" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/nightlife/karaoke_", 
         "suffix": ".png" 
        }, 
        "id": "5744ccdfe4b0c0459246b4bb", 
        "name": "Karaoke Box", 
        "pluralName": "Karaoke Boxes", 
        "shortName": "Karaoke" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/default_", 
         "suffix": ".png" 
        }, 
        "id": "52e81612bcbc57f1066b79e6", 
        "name": "Laser Tag", 
        "pluralName": "Laser Tag Places", 
        "shortName": "Laser Tag" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/historicsite_", 
         "suffix": ".png" 
        }, 
        "id": "5642206c498e4bfca532186c", 
        "name": "Memorial Site", 
        "pluralName": "Memorial Sites", 
        "shortName": "Memorial Site" 
       }, 
       { 
        "categories": [], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/golfcourse_", 
         "suffix": ".png" 
        }, 
        "id": "52e81612bcbc57f1066b79eb", 
        "name": "Mini Golf", 
        "pluralName": "Mini Golf Courses", 
        "shortName": "Mini Golf" 
       }, 
       { 
        "categories": [ 
         { 
          "categories": [], 
          "icon": { 
           "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/movietheater_", 
           "suffix": ".png" 
          }, 
          "id": "56aa371be4b08b9a8d5734de", 
          "name": "Drive-in Theater", 
          "pluralName": "Drive-in Theaters", 
          "shortName": "Drive-in Theater" 
         }, 
         { 
          "categories": [], 
          "icon": { 
           "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/movietheater_", 
           "suffix": ".png" 
          }, 
          "id": "4bf58dd8d48988d17e941735", 
          "name": "Indie Movie Theater", 
          "pluralName": "Indie Movie Theaters", 
          "shortName": "Indie Movies" 
         }, 
         { 
          "categories": [], 
          "icon": { 
           "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/movietheater_", 
           "suffix": ".png" 
          }, 
          "id": "4bf58dd8d48988d180941735", 
          "name": "Multiplex", 
          "pluralName": "Multiplexes", 
          "shortName": "Cineplex" 
         } 
        ], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/movietheater_", 
         "suffix": ".png" 
        }, 
        "id": "4bf58dd8d48988d17f941735", 
        "name": "Movie Theater", 
        "pluralName": "Movie Theaters", 
        "shortName": "Movie Theater" 
       }, 
       { 
        "categories": [ 
         { 
          "categories": [], 
          "icon": { 
           "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/museum_art_", 
           "suffix": ".png" 
          }, 
          "id": "4bf58dd8d48988d18f941735", 
          "name": "Art Museum", 
          "pluralName": "Art Museums", 
          "shortName": "Art Museum" 
         }, 
         { 
          "categories": [], 
          "icon": { 
           "prefix": "https://ss3.4sqi.net/img/categories_v2/nightlife/stripclub_", 
           "suffix": ".png" 
          }, 
          "id": "559acbe0498e472f1a53fa23", 
          "name": "Erotic Museum", 
          "pluralName": "Erotic Museums", 
          "shortName": "Erotic Museum" 
         }, 
         { 
          "categories": [], 
          "icon": { 
           "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/museum_history_", 
           "suffix": ".png" 
          }, 
          "id": "4bf58dd8d48988d190941735", 
          "name": "History Museum", 
          "pluralName": "History Museums", 
          "shortName": "History Museum" 
         }, 
         { 
          "categories": [], 
          "icon": { 
           "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/museum_planetarium_", 
           "suffix": ".png" 
          }, 
          "id": "4bf58dd8d48988d192941735", 
          "name": "Planetarium", 
          "pluralName": "Planetariums", 
          "shortName": "Planetarium" 
         }, 
         { 
          "categories": [], 
          "icon": { 
           "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/museum_science_", 
           "suffix": ".png" 
          }, 
          "id": "4bf58dd8d48988d191941735", 
          "name": "Science Museum", 
          "pluralName": "Science Museums", 
          "shortName": "Science Museum" 
         } 
        ], 
        "icon": { 
         "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/museum_", 
         "suffix": ".png" 
        }, 
        "id": "4bf58dd8d48988d181941735", 
        "name": "Museum", 
        "pluralName": "Museums", 
        "shortName": "Museum" 
       }, 
      "icon": { 
       "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/default_", 
       "suffix": ".png" 
      }, 
      "id": "4d4b7104d754a06370d81259", 
      "name": "Arts & Entertainment", 
      "pluralName": "Arts & Entertainment", 
      "shortName": "Arts & Entertainment" 
     }, 

我的代码会将第一个层次,它总是下面列出它的子类。

import urllib.request 
import json 
import sqlite3 
from key import ID, SECRET 

CLIENT_ID = ID 
CLIENT_SECRET = SECRET 
v = '20170315' 

url = 'https://api.foursquare.com/v2/venues/categories?client_id='+ CLIENT_ID +'&client_secret=' + SECRET + '&v=' + v 

contents = urllib.request.urlopen(url).read() 

parsed = json.loads(contents) 


clean = parsed['response']['categories'] 
my_list = [i['name'] for i in clean] 
print(my_list) 

输出:

['Arts & Entertainment', 'College & University', 'Event', 'Food', 'Nightlife Spot', 'Outdoors & Recreation', 'Professional & Other Places', 'Residence', 'Shop & Service', 'Travel & Transport'] 

我无法解析,以获得子类别。我试图拉idname为所有类别,分或不。

回答

1

如果一个数据结构被递归嵌套,一个递归函数常常是解析它的最简单的方法:

def get_categories(data): 
    result = {} 
    for cat in data: 
     result[cat['id']] = cat['name'] 
     if cat['categories']: 
      result.update(get_categories(cat['categories'])) 
    return result 

这将返回的id: name键/值对的字典,递归调用自身和任何更新result沿途发现的子类别。

if检查不是严格必要的,因为用空列表调用函数只会返回一个空字典,但它节省了大量毫无意义的递归调用,所以应该提高性能。

这里是你如何使用它:

categories = get_categories(parsed['response']['categories']) 

...这里是结果:

>>> from pprint import pprint 
>>> pprint(categories) 
{'4bf58dd8d48988d100941735': 'Meeting Room', 
'4bf58dd8d48988d100951735': 'Pet Store', 
'4bf58dd8d48988d101941735': 'Martial Arts Dojo', 
    # ... 
'57558b36e4b065ecebd306da': 'Savoyard Restaurant', 
'57558b36e4b065ecebd306dd': 'Truck Stop', 
'589ddde98ae3635c072819ee': 'Duty-free Shop'} 
+1

谢谢!像魅力一样工作,我将更多地关注递归函数。 – Bernardo