2016-10-06 11 views
1

Ich versuche, ein Skript zu schreiben, Bilder von einer API zum Download, ich habe ein eine Schleife einrichten, die wie folgt lautet:Access-JSON-Daten von API

response = requests.get(url, params=query) 
    json_data = json.dumps(response.text) 
    pythonVal = json.loads(json.loads(json_data)) 
    print(pythonVal) 

Der Druck (pythonVal) liefert:

{ 
    "metadata": { 
    "code": 200, 
    "message": "OK", 
    "version": "v2.0" 
    }, 
    "data": { 
    "_links": { 
    "self": { 
     "href": "redactedLink" 
    } 
    }, 
    "id": "123456789", 
    "_fixed": true 
    , 
    "type": "IMAGE", 
    "source": "social media", 
    "source_id": "1234567890_1234567890", 
    "original_source": "link", 
    "caption": "caption", 
    "video_url": null, 
    "share_url": "link", 
    "date_submitted": "2016-07-11T09:34:35+00:00", 
    "date_published": "2016-09-11T16:30:26+00:00", 

ich halte einen Fehler erhalten, die lautet:

UnicodeEncodeError: 'ascii' codec can't encode character '\xc4' in 
position 527: ordinal not in range(128) 

Für die pythonVal Variable, wenn ich es nur auf json.loads(json_data) gesetzt, druckt er o ut die JSON-Antwort, aber dann, wenn ich pythonVal['data'] versuchen zu tun ich eine andere Fehlermeldung erhalten, die lautet: Ich möchte in der Lage sein, es zu bekommen Daten aus

TypeError: string indices must be integers 

Letztlich

wie etwas, indem Sie
pythonVal['data']['_embedded']['uploader']['username'] 

Danke für deinen Beitrag!

Antwort

1

Warum json.loads() zweimal tun? Wechsel:

json.loads(json.loads(json_data)) 

zu:

json.loads(json_data) 

und es sollte funktionieren.

Nun, da Sie Fehler bekommen sind TypeError: string indices must be integers auf pythonVal['data'] tun, bedeutet dies, dass der Wert von pythonVal von list Typ ist und nicht dict. Stattdessen tun:

for item in pythonVal: 
    print item 

Bitte beachten Sie auch die Probe JSON Inhalt mit der Frage erwähnen, wenn Sie von anderen besser helfen wollen :)

+0

Hey danke! Also habe ich json.loads (json_data) gemacht, aber wie ich erwähnt habe, bekam ich diesen zweiten Fehler, wenn ich etwas in pythonVal mache, wird es jeden einzelnen Buchstaben aus meiner Antwort drucken, was ich nicht will versuchen, bestimmte Daten aus einer API-Antwort zu erhalten 'code' "Status": "approved", "likes": 23, "request_id": null,' code' zum Beispiel, wenn ich den Status bekommen wollte ich würde wollen in der Lage sein pythonVal zu sagen [ ‚Status‘] und haben sie zurückkehren ‚zugelassen‘ –

+0

befehle ich besser lassen Sie mich Ihr Problem verstehen, könnten Sie bitte die Frage mit der Ausgabe von 'Druck pythonVal' und in diesem Punkt aktualisieren mich der Wert, den Sie brauchen. –

0

das Setzen folgend oben auf Ihrem Code. Dies funktioniert durch Überschreiben der nativen ASCII-Codierung von Python zu UTF-8.

# -*- coding: utf-8 -*- 

Der zweite Fehler ist, weil Sie bereits die Zeichenfolge bekommen haben, und Sie Integer-Indizes müssen die Zeichen der Zeichenfolge zu erhalten.