2011-09-01 3 views
0

Je joue avec un script python pour tirer, analyser et formater la tendance JSON de Twitter. L'emplacement format spécifique niche les tendances à l'intérieur d'un tableau:Comment travailler avec plusieurs formats JSON?

[ 
    { 
    "created_at": "2010-07-15T22:31:11Z", 
    "trends": [ 
     { 
     "name": "trendy", 
     "url": "http://search.twitter.com/search?q=trendy", 
     "query": "trendy" 
     }, ... 

Alors que les formats JSON quotidiens et hebdomadaires ne le font pas:

{ 
    "trends": { 
    "2011-01-14 15:20": [ 
     { 
     "name": "#trendy", 
     "events": null, 
     "promoted_content": null, 
     "query": "#trendy" 
     }, 

J'utilise ce python pour lister les tendances:

class trend: 
     #initialize a "trend" object with foo = trend(query,name ...) 
     def __init__(self, query, name, promoted_content, events, url): 
       self.query = query 
       self.name = name 
       self.promoted_content = promoted_content 
       self.events = events 
       self.url = url 

class trending: 
     def __init__(self,api_url,title): 
       self.api_url = api_url 
       self.title = title 

     def get_trending(self): 
       import simplejson as json 
       import urllib2 

       trends_all = json.loads(urllib2.urlopen(self.api_url).read()) 
       return trends_all 

     def list_trending(self): 
       trends_all = self.get_trending() 
       print "%s\n" % self.title 

       for x in trends_all[0]['trends']: 
        thistrend = trend(x['query'], x['name'], x['promoted_content'], x['events'], x['url']) 
        print "\t %s (%s) %s" %(thistrend.name, thistrend.url, thistrend.promoted_content) 

Ceci fonctionne pour les formats d'emplacement (le premier) mais pas les formats quotidiens/hebdomadaires. Je me demande donc s'il y a une façon intelligente de distinguer les deux structures JSON et de les restructurer pour pouvoir travailler avec les deux.

Répondre

0

Le cas le plus générique est celui avec la liste. Puisque vous n'avez besoin que du premier élément, si l'objet analysé est une liste, vous devez extraire la première valeur.

Dans votre code, vous pouvez simplement remplacer:

for x in trends_all[0]['trends']: 
    ... 

avec

if isinstance(trends_all, list): 
    trends_all = trends_all[0] 
for x in trends_all['trends']: 
    ... 
Questions connexes