.json() - Expecting value: line 1...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Serpens66
User
Beiträge: 259
Registriert: Montag 15. Dezember 2014, 00:31

Hi :)
Ich nutze Python 3.4.
Ich mache Calls mit dem requests Modul zu einer API und bekomme die Antwort in json. Mit .json() kann ich die Antwort dann in was lesbares umwandeln. Das klappt auch meistens.
Nun kommt es ab und an vor, dass ich beim Versuch die antwort mit .json() umzuwandeln eine Fehlermeldung bekomme, wie:
Expecting value: line 1 column 1 (char 0)

Wenn ich mir die Antwort ohne json() ausgebe, ist es meistens irgendein Fehler response (normal ist 200), wie <Response [502]>.

Ich habe aber auch festgestellt, dass json() probleme hat, wenn in der Antwort Zeichen sind, die es nicht kennt. So bekomme ich heute
Expecting value: line 1 column 45 (char 44) , obwohl es ein <Response [200]> ist.

Ich hatte sowas schonmal und hatte irgendwie festgestellt, dass es nicht geht, weil zb ein ü oder sonstige Buchstaben in der Antwort waren.

Gibt es etwas, dass ich anstelle von json() machen kann, um die Antwort korrekt umzuwandeln? Oder muss ich noch iwas anderes zusätzlich zum json() machen, damit diese Fehler verschwinden und ich eine vernünftige Antwort erhalte?

edit:
achso, wen der komplette Traceback interessiert:
Traceback (most recent call last):
File "/API.py", line 46, in query_call
return (response.json() )
File "/usr/lib/python3/dist-packages/requests/models.py", line 786, in json
return json.loads(self.content.decode(encoding), **kwargs)
File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.4/json/decoder.py", line 361, in raw_decode
raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 45 (char 44)
BlackJack

@Serpens66: Bevor man `json()` aufruft sollte man die Antwort befragen ob sie auf HTTP-Ebene überhaupt erfolgreich war, wenn man diesen Fall von einer erfolgreichen HTTP-Antwort, aber mit fehlerhaften Daten unterscheiden können möchte.

Wenn `json()` bei einer erfolgreichen HTTP-Antwort mit JSON als Inhalt eine Ausnahme auslöst, zum Beispiel wegen „Zeichen die es nicht kennt“, dann hat der Server entweder bei der Kodierung beziehungsweise deren Angabe, oder direkt beim Erzeugen des JSON Mist gebaut, oder die Kodierung konnte nicht richtig geraten werden. Ein allgemeines Heilmittel gibt es dann nicht. Da würde ich die Schuld auf den Server schieben, denn entweder gibt der eine Kodierung, an die mit dem Dokument übereinstimmt, oder das Dokument sollte UTF-8, -16, oder -32 kodiert sein und entsprechend in einer dieser Kodierungen dekodierbar sein. `requests` prüft das.
Serpens66
User
Beiträge: 259
Registriert: Montag 15. Dezember 2014, 00:31

BlackJack hat geschrieben:@Serpens66: Bevor man `json()` aufruft sollte man die Antwort befragen ob sie auf HTTP-Ebene überhaupt erfolgreich war, wenn man diesen Fall von einer erfolgreichen HTTP-Antwort, aber mit fehlerhaften Daten unterscheiden können möchte.
Du meinst also erst prüfen, ob es ein 200 er response ist, bevor ich json() versuche? Falls du das meinst, hilft das aber nicht unbedingt, denn auch andere response arten lassen sich ab und zu mit json() entpacken und geben dann genauere auskunft über den Fehler. Aber leider nicht alle...
BlackJack hat geschrieben: Wenn `json()` bei einer erfolgreichen HTTP-Antwort mit JSON als Inhalt eine Ausnahme auslöst, zum Beispiel wegen „Zeichen die es nicht kennt“, dann hat der Server entweder bei der Kodierung beziehungsweise deren Angabe, oder direkt beim Erzeugen des JSON Mist gebaut, oder die Kodierung konnte nicht richtig geraten werden. Ein allgemeines Heilmittel gibt es dann nicht. Da würde ich die Schuld auf den Server schieben, denn entweder gibt der eine Kodierung, an die mit dem Dokument übereinstimmt, oder das Dokument sollte UTF-8, -16, oder -32 kodiert sein und entsprechend in einer dieser Kodierungen dekodierbar sein. `requests` prüft das.
ja ist schon relativ sicher, dass es daran liegt, dass der Absender mist gebaut hat. Leider hilft das nicht viel, denn z.b den "Expecting value: line 1 column 1 (char 0) " Fehler bekomme ich recht häufig. Habe bereits lang und breit mit dem Support darüber geschrieben, aber die konnten nicht helfen. Allerdings wusste ich damals noch nicht, dass der Fehler bei json() ausgelöst wird und der Support konnte mit python nichts anfangen.
Also sollte ich sie vllt nochmal kontaktieren und das stichwort "falsche Kodierung" oderso nennen?

Der Expecting value: line 1 column 45 (char 44) Fehler kommt erst seit heute, nachdem die Website ein Update gemacht hat. Vermutlich ist dabei was scheifgegangen und ich hab schon dem Support geschrieben. Ich hatte nur gehofft es gäbe ein Weg die fehlerhafte Antwort sichtbar zu machen, da der Support mit der feherhaften antwort sicher mehr anfangen kann, als mit meinen Expecting value Fehler.

Kann ich denn vllt manuell alle Kodierungen durchgehen? So nach dem Motto "Wenn json() eine Fehlermeldung ausspuckt, dann versuch es mal mit UTF-8 und wenn das auch nicht geht dann mit UTF-16 usw. , in der Hoffnung dass eines von denen erfoglreich ist?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Serpens66: ohne zu wissen, was der Server tatsächlich meldet und wo das Problem liegt, würde ich nicht wild herumraten. Wenn erst Zeichen 44 fehlerhaft ist, deutet das nicht auf einen Encodierungfehler, sondern auf einen Kodierungsfehler im JSON. Ob der Response JSON ist oder nicht, sollte man am Content-Type unterscheiden können.
Serpens66
User
Beiträge: 259
Registriert: Montag 15. Dezember 2014, 00:31

Sirius3 hat geschrieben:@Serpens66: ohne zu wissen, was der Server tatsächlich meldet und wo das Problem liegt, würde ich nicht wild herumraten. Wenn erst Zeichen 44 fehlerhaft ist, deutet das nicht auf einen Encodierungfehler, sondern auf einen Kodierungsfehler im JSON. Ob der Response JSON ist oder nicht, sollte man am Content-Type unterscheiden können.
also was sollte/kann ich tun?
BlackJack

@Serpens66: Es gibt mehr „In Ordnung“-Antworten bei HTTP als nur 200. Dafür gibt's beim `Response`-Objekt ein `ok`-Attribut.

Du solltest dem Support vor allem komplette Fehler beschreiben, also am besten die komplette Kommunikation, also Anfrage mir URL, Headern, und Body, und Antwort mit Headern und Body 1:1 die Binärdaten in eine Binärdatei speichern. Sonst geht denen das am Ende wie uns: Wildes herumraten weil nicht genug Informationen vorhanden sind.

Kodierungen durchprobieren macht die `json()`-Methode bereits wenn keine vorgegeben wurde.

Zur abschliessenden Frage: Schreib Header und die Rohdaten in eine Datei und schau was tatsächlich gesendet wurde.
Serpens66
User
Beiträge: 259
Registriert: Montag 15. Dezember 2014, 00:31

BlackJack hat geschrieben:@Serpens66: Es gibt mehr „In Ordnung“-Antworten bei HTTP als nur 200. Dafür gibt's beim `Response`-Objekt ein `ok`-Attribut.

Du solltest dem Support vor allem komplette Fehler beschreiben, also am besten die komplette Kommunikation, also Anfrage mir URL, Headern, und Body, und Antwort mit Headern und Body 1:1 die Binärdaten in eine Binärdatei speichern. Sonst geht denen das am Ende wie uns: Wildes herumraten weil nicht genug Informationen vorhanden sind.

Kodierungen durchprobieren macht die `json()`-Methode bereits wenn keine vorgegeben wurde.

Zur abschliessenden Frage: Schreib Header und die Rohdaten in eine Datei und schau was tatsächlich gesendet wurde.
danke dir.
Nur noch eine Frage, die ganzen Daten die ich brauche, wie bekomme ich die? ich hab ja
response = requests.request(...)
Wie komme ich da nun an all die andern Daten die du erwähnt hast, also headern und body der antwort, sowie die binärdaten. Und auch ob im reponse objekt ein "ok" drin steht?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Serpens66: und welche der Fragen lassen sich nicht durch einen kurzen Blick in die requests-Dokumentation beantworten? Z.B. gleich das erste Code-Beispiel?
Antworten