2016-05-01 19 views
2

Ich erhalte den Fehler TypeError: String-Indizes müssen Ganzzahlen sein, wenn eine JSON-Antwort analysiert wird. Ich sehe nicht, was ich falsch mache, ist die Antwort ein Wörterbuch ist ..Python- und JSON-Fehler - TypeError: String-Indizes müssen Ganzzahlen sein

Eine Probe von meinem Code, der den gleichen Fehler aus einem prüfbaren frei REST API bekommt:

import requests 

response = requests.get('http://services.groupkt.com/state/get/IND/all') 

for states in response.json(): 
    print ('{} {}'.format(states['name'], states['capital'])) 
+0

... drucken aus ... – thebjorn

Antwort

2

Wenn Sie über ein Wörterbuch iterieren, iterieren Sie über seine Schlüssel. Der (einzige) Schlüssel der obersten Ebene für dieses Wörterbuch ist "RestResponse" und Ihr Code lautet: "RestResponse"["name"]. Da es eine Zeichenkette ist, erwartet Python ganzzahlige Indizes (wie "RestResponse" [3] für Slicing).

Wenn Sie die Struktur des resultierenden Wörterbuch untersuchen Sie sehen, dass die Ergebnisse, die Sie wollen, sind unter response.json()["RestResponse"]["result"]:

for states in response.json()["RestResponse"]["result"]: 
    print ('{} {}'.format(states['name'], states['capital'])) 

Out:

Andhra Pradesh Hyderabad, India 
Arunachal Pradesh Itanagar 
Assam Dispur 
Bihar Patna 
Chhattisgarh Raipur 
... 
0

Ihre Antwort ist kein Array, sondern ein Objekt.
Die for-Schleife in Ihrem Code ist tatsächlich über die Schlüssel in einer dict (geparste Version des JSON-Objekts).

0

Wenn Sie iterable über response.json() Sie gerade sind Iterieren über die str RestResponse, die das erste Element in Ihrem dict ist.

Also, sollten Sie Ihren Code wie folgt ändern:

for states in response.json()['RestResponse']['result']: 
    print ('{} {}'.format(states['name'], states['capital'])) 

Dann wird die Ausgabe sein:

Andhra Pradesh Hyderabad, India 
Arunachal Pradesh Itanagar 
Assam Dispur 
Bihar Patna 
Chhattisgarh Raipur 
Goa Panaji 
Gujarat Gandhinagar 
Haryana Chandigarh 
Himachal Pradesh Shimla 
... 
0

Die Ergebnisse, die Sie so wollen "RestResponse" => "result"

"RestResponse" : { 
    "messages" : [...] 
    "result" : [ {}, {}, {} ... ] 
} 

sind unter Um die Zustände zu erhalten, sollten Sie die Werte des result Arrays erhalten.

request = requests.get('http://services.groupkt.com/state/get/IND/all') 
response = request.json() 
states = response["RestResponse"]["result"] 

Jetzt können Sie tun:

for state in states: 
    print ('{} {}'.format(state['name'], state['capital'])) 

Die Ausgabe sollte wie zu erwarten.

Verwandte Themen