Wie gehören die Bilder, die bytes in eine JSON mit python? (das encoding Problem)
Ich würde gerne Bild-bytes in eine JSON -, aber ich Kämpfe mit einem encoding-Problem:
import urllib
import json
data = urllib.urlopen('https://www.python.org/static/community_logos/python-logo-master-v3-TM-flattened.png').read()
json.dumps({'picture' : data})
UnicodeDecodeError: 'utf8' codec kann nicht decodieren byte 0x89 in position 0: invalid start byte
Ich weiß nicht, wie umgehen mit diesem Thema, da ich mich im Umgang mit einem Bild, also ich bin ein bisschen verwirrt über das encoding-Problem. Ich verwende python 2.7. Wer kann mir helfen? 🙂
InformationsquelleAutor Thom | 2015-01-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
JSON-Daten erwartet Griff Unicode-text. Binären Bilddaten ist nicht auf den text, so dass, wenn die
json.dumps()
Funktion versucht zu Dekodieren, die bytestring zuunicode
mit UTF-8 (Standard), das Dekodieren fehlschlägt.Müssen Sie wickeln Sie Ihre binäre Daten in eine text-sichere Codierung zunächst, wie Base-64:
Dadurch wird natürlich davon ausgegangen, dass der Empfänger erwartet, dass Ihre Daten gewickelt, so.
Wenn Ihre API-Endpunkt wurde so schlecht gestaltet zu erwarten, dass Ihr Bild-bytes werden als text übergeben, der dann die alternative ist, zu behaupten, dass deine bytes sind wirklich text; wenn Sie zuerst entschlüsseln, es als Latin-1 können Sie die Karte die bytes direkt zu Unicode-codepoints:
Mit den Daten bereits eine
unicode
Objekt derjson
Bibliothek wird dann gehen, um es zu behandeln, als text. Dies bedeutet, dass es ersetzen können nicht-ASCII-codepoints mit\uhhhh
entweicht.dann, dass die API ist
Ich gab Ihnen eine andere option gibt es, aber berücksichtigen, dass der Versuch, diese Arbeit zu machen mit einer API so schlecht gestaltet wie das ist hit-and-miss, asa Sie brechen die JSON-RFC.
InformationsquelleAutor Martijn Pieters
Die beste Lösung, meiner Meinung nach kommt für diese situation, Raum-Weise, ist base85-Codierung das entspricht vier bytes als fünf Zeichen. Auch Sie könnte auch die Karte jedes byte, um das entsprechende Zeichen in U+0000-U+00FF-format und dann werfen Sie es in das json-Format.
Aber immer noch, die könnten overkill Methoden für diese und base64, einfache Weise, würde der Sieger sein.
InformationsquelleAutor Kostas Livieratos