2014-07-12 15 views
13

sto imparando a usare Python e le API (in particolare, questa API Coppa del Mondo, http://www.kimonolabs.com/worldcup/explorer)Python e JSON - TypeError indici delle liste devono essere numeri interi non str

I dati JSON è simile al seguente:

[ 
    { 
    "firstName": "Nicolas Alexis Julio", 
    "lastName": "N'Koulou N'Doubena", 
    "nickname": "N. N'Koulou", 
    "assists": 0, 
    "clubId": "5AF524A1-830C-4D75-8C54-2D0BA1F9BE33", 
    "teamId": "DF25ABB8-37EB-4C2A-8B6C-BDA53BF5A74D", 
    "id": "D9AD1E6D-4253-4B88-BB78-0F43E02AF016", 
    "type": "Player" 
    }, 

{ 
    "firstName": "Alexandre Dimitri", 
    "lastName": "Song-Billong", 
    "nickname": "A. Song", 
    "clubId": "35BCEEAF-37D3-4685-83C4-DDCA504E0653", 
    "teamId": "DF25ABB8-37EB-4C2A-8B6C-BDA53BF5A74D", 
    "id": "A84540B7-37B6-416F-8C4D-8EAD55D113D9", 
    "type": "Player" 
    }, 
    ] 

Sto semplicemente cercando di stampare tutti i primi nomi in questa API. Ecco quello che ho:

import urllib2 
import json 

url = "http://worldcup.kimonolabs.com/api/players?apikey=xxx" 
json_obj = urllib2.urlopen(url).read 
readable_json = json.dumps(json_obj) 
playerstuff = readable_json['firstName'] 
for i in playerstuff: 
    print i['firstName'] 

Ma quando l'eseguo, ottengo l'errore "... linea 8, in ... TypeError: indici delle liste devono essere interi, non Str"

ho cercò soluzioni, ma sembra che trovi domande per domande più approfondite sull'API e non ho ancora capito tutto, quindi qualsiasi aiuto o spiegazione su ciò che dovrei fare sarebbe sorprendente. Grazie!

+1

Solo un po 'di saggezza comune di pitone - le richieste http://docs.python-requests.org/en/latest/ biblioteca è di solito un gran migliore alternativa all'utilizzo di urllib2. –

+0

Ci guarderò, grazie! – user3718365

+0

Al posto dell'url non riesco a leggere qualcosa del tipo: @ app.route ('/ test', methods = ['GET', 'POST']) def foo(): json_obj = request.json readable_json = json. carichi (json_obj) per i in readable_json: print i ['firstName'] se faccio lo stesso, ottengo TypeError: stringa attesa o buffer –

risposta

18

Prima di tutto, si dovrebbe usare json.loads, non json.dumps. loads converte il testo di origine JSON in un valore Python, mentre dumps va nella direzione opposta.

Dopo averlo corretto, in base allo snippet JSON nella parte superiore della domanda, readable_json sarà un elenco e quindi readable_json['firstName'] non ha senso. Il modo corretto per ottenere il campo 'firstName' di ogni elemento di un elenco è eliminare la riga playerstuff = readable_json['firstName'] e modificare for i in playerstuff: in for i in readable_json:.

+0

Aha! Grazie per le tue spiegazioni, questo ha fatto il trucco. Ora, per diventare goloso, come posso stampare anche "lastName", accanto al nome con uno spazio? E se avete qualche consiglio su un tutorial (che inizia in modo semplice) su python e API, sono tutto orecchie! Grazie per il vostro aiuto! – user3718365

+0

@ user3718365: 'print i ['firstName'], i ['lastName']' – jwodder

+0

Grazie! Un'ultima domanda che dovrebbe portarmi sulla mia strada: Se volessi elencare tutte le possibili chiavi (es .: firstName, lastName, age, ecc.) In modo che l'utente possa digitare ciò che vuole vedere, come potrei restituire un elenco delle chiavi (è la parola giusta)? Inoltre, sono nuovo di StackOverflow, quindi mi dispiace se non dovrei aggiungere domande alle domande. – user3718365

2

È possibile semplificare il codice verso il basso per

url = "http://worldcup.kimonolabs.com/api/players?apikey=xxx" 
json_obj = urllib2.urlopen(url).read 
player_json_list = json.loads(json_obj) 
for player in readable_json_list: 
    print player['firstName'] 

Stavi cercando di accedere ad un elemento della lista utilizzando la sintassi dizionario. l'equivalente di

foo = [1, 2, 3, 4] 
foo["1"] 

Può essere fonte di confusione quando si dispone di elenchi di dizionari e di mantenere l'annidamento in ordine.

+0

Grazie per questo, aiuta. Molto apprezzato. – user3718365

+0

Quindi contrassegnare questa risposta come accettata. –

14

ho risolto cambiando

readable_json['firstName'] 

da

readable_json[0]['firstName'] 
+0

hi = json.dumps (['foo', {'bar': ('baz', None, 1.0, 2)}]) ji = json.loads (hi), ji [0] ["foo"] Traceback (ultima chiamata ultima): File "", riga 1, in TipoErrore: gli indici stringa devono essere numeri interi –

Problemi correlati