Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe

Einführung

Möglicherweise möchten Sie beim Erstellen von APIs base64-codierte Daten zurückgeben, oder? Dieses Mal war ich süchtig danach, also ließ ich es stehen. Da die Gedanken als schlampig geschrieben sind, wenn Sie es kurz schreiben

data_bytes = bytes('Akanechan Kawaii Yatta', 'utf-8')
data_encode_bytes = base64.b64encode(data_bytes)
data_encode_str = data_encode_bytes.decode('utf-8')

Diese drei Zeilen sind das Ergebnis.

Vorbereitete Daten

In Python haben der Dict-Typ und Json dieselbe Form. Nach der Verarbeitung mit dem Dict-Typ, der einfach zu verarbeiten ist, wird er schließlich in Json konvertiert.

akane_dict = {
            'kind': 'voiceroid',
            'data': 'Akanechan Kawaii Yatta'
        }

Es ist auf verschiedene Arten verpackt. Dieses Mal möchte ich "data" mit base64 codieren und "json.dumps" ausführen.

Vorbereitung der Datencodierung

Machen Sie `'data' `vom zu codierenden Bytetyp.

data_bytes = b'Akanechan Kawaii Yatta'

akane_dict = {
            'kind': 'voiceroid',
            'data': data_bytes
        }

Das ist nicht gut.

    data = b'Akanechan Kawaii Yatta'
          ^
SyntaxError: bytes can only contain ASCII literal characters.

'Akanechan Kawaii Yatta'Ist nicht ASCII, also ist es natürlich (1 Verlust)

Ich gebe Zeichen in UTF-8 für die VS-Code-Eingabe ein, daher scheint dies zu funktionieren.


data_bytes = bytes('Akanechan Kawaii Yatta', 'utf-8')

akane_dict = {
            'kind': 'voiceroid',
            'data': data_bytes
        }

Datenkodierung

Da base64 standardmäßig enthalten ist, können Sie es so importieren, wie es ist.

import base64

data_bytes = bytes('Akanechan Kawaii Yatta', 'utf-8')
data_encode_bytes = base64.b64encode(data_bytes)

akane_dict = {
    'kind': 'voiceroid',
    'data': data_encode_bytes
}

print(akane_dict) #Zur Bestätigung

Umstellung auf Json

Wir werden den Dict-Typ in Json konvertieren.

import base64
import json

data_bytes = bytes('Akanechan Kawaii Yatta', 'utf-8')
data_encode_bytes = base64.b64encode(data_bytes)

akane_dict = {
    'kind': 'voiceroid',
    'data': data_encode_bytes
}

akane_json = json.dumps(akane_dict)

Der folgende Fehler tritt auf.


TypeError: Object of type bytes is not JSON serializable

Dies kann nicht in Json konvertiert werden, wenn es der Bytetyp bleibt! Sie werden wütend, also müssen Sie es in str-Typ konvertieren. (2 Verluste)

Strategie 1

Es ist eine Besetzung, die den Str-Typ zu ändern scheint! Dann wird es so sein.

import base64
import json

data_bytes = bytes('Akanechan Kawaii Yatta', 'utf-8')
data_encode_bytes = base64.b64encode(data_bytes)
data_encode_str = str(data_encode_bytes)

akane_dict = {
    'kind': 'voiceroid',
    'data': data_encode_str
}

print(akane_dict)
#Senden
akane_json = json.dumps(akane_dict)

#Erhalten
res = json.loads(akane_json)
print(res)
res_data = base64.b64decode(res['data'])
print(res_data)
binascii.Error: Invalid base64-encoded string: number of data characters (53) cannot be 1 more than a multiple of 4 

Genau. Wenn Sie in str-Typ umwandeln, wird es so sein. Werfen wir einen Blick auf den Inhalt von `res.

{'kind': 'voiceroid', 'data': "b'44Ki44Kr44ON44OB44Oj44Oz44Kr44Ov44Kk44Kk44Ok44OD44K/'"}

Es kann möglich sein, es zu senden, aber es scheint unmöglich, "Daten" zu dekodieren.

Strategie 2

Artikel Ich habe (1) gefunden und den Code als Referenz wie folgt geändert.

import base64
import json

data_bytes = bytes('Akanechan Kawaii Yatta', 'utf-8')
data_encode_bytes = base64.b64encode(data_bytes)
data_encode_str = data_encode_bytes.decode('utf-8')

akane_dict = {
    'kind': 'voiceroid',
    'data': data_encode_str
}

print(akane_dict)
#Senden
akane_json = json.dumps(akane_dict)

#Erhalten
res = json.loads(akane_json)
res_data = base64.b64decode(res['data']).decode('utf-8')
print(res_data)

Das Seltsame dabei ist, dass der Bytetyp von utf8 in eine Zeichenfolge dekodiert wird. Ich verstehe nicht, warum ich dies aufgrund mangelnder Studien tun sollte, aber wenn ich dies tue, funktioniert json.dumps gut und die empfangende Seite wird nicht mit einem Fehler geschärft. Auf der Empfangsseite ist es nicht erforderlich, mit utf8 zu dekodieren, wenn es als Bytetyp behandelt wird. Dann anzeigen

{'kind': 'voiceroid', 'data': '44Ki44Kr44ON44OB44Oj44Oz44Kr44Ov44Kk44Kk44Ok44OD44K/'}
Akanechan Kawaii Yatta

Ja, sieht gut aus

schließlich

Es scheint ein wenig unorganisiert zu sein, aber ich habe einen Artikel geschrieben, um herauszufinden, wo ich besiegt wurde.

Referenz

(1) Python: Binärdateien mit JSON verarbeiten

Recommended Posts

Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Was ich süchtig nach Python Autorun war
Wovon ich süchtig war, als ich Python Tornado benutzte
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
Wovon ich süchtig war, als ich ALE in Vim für Python einführte
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
Wovon ich süchtig war, als ich mit riesigen Dateien in einer Linux 32-Bit-Umgebung umging
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Der Dateiname war in Python schlecht und ich war süchtig nach Import
Wovon ich beim Erstellen von Webanwendungen in einer Windows-Umgebung abhängig war
Base64-Codierung von Bildern in Python 3
Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
Ich möchte mit einem Roboter in Python arbeiten.
pickle Um zu lesen, was in 2 Serien mit 3 Serien gemacht wurde
Ein Hinweis, dem ich beim Ausführen von Python mit Visual Studio Code verfallen war
Was ich in Python gelernt habe
Python: Kann in Lambda wiederholt werden
Ich war süchtig danach, logging.getLogger mit Flask 1.1.x zu versuchen
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Wovon ich süchtig war, als ich Klassenvererbung und gemeinsame Tabellenvererbung in SQLAlchemy kombinierte
Was ich getan habe, als ich wütend war, es mit der Option enable-shared einzufügen
[IOS] GIF-Animation mit Pythonista3. Ich war süchtig danach.
Was ich getan habe, um die Python2 EOL mit Zuversicht zu begrüßen
[Fix] Ich war süchtig nach dem alphanumerischen Urteil über Python-Strings
Was tun mit PYTHON Release?
Ich möchte mit Python debuggen
Ich war süchtig nach Multiprocessing + Psycopg2
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
Ich habe versucht zusammenzufassen, was mit Qiita mit Word Cloud ausgegeben wurde
Ein Hinweis, dem ich beim Erstellen einer Tabelle mit SQL Alchemy verfallen war
Ich habe versucht, PLSA in Python zu implementieren
Als ich versuchte, mithilfe von Anforderungen in Python zu kratzen, war ich süchtig nach SSLError, also einem Workaround-Memo
Versuchen Sie, sich mit Python bei qiita anzumelden
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, PLSA in Python 2 zu implementieren
So setzen Sie die Standardcodierung in Python auf utf-8
Ich war süchtig danach, mysqlclient zu installieren
Ich wollte ABC160 mit Python lösen
So arbeiten Sie mit BigQuery in Python
Ich möchte Protokolle mit Python analysieren
Ich war auf dotCloud süchtig nach Flask
Ich möchte mit aws mit Python spielen
Ich habe versucht, ADALINE in Python zu implementieren
Ich wollte ABC159 mit Python lösen
Ich habe versucht, PPO in Python zu implementieren
Was ich mit Python-Arrays gemacht habe
So betreiben Sie die Zeitstempelstation in Python
Ich wollte ABC172 mit Python lösen
Als ich Django in mein Home-Verzeichnis legte, wurde ich mit einem Berechtigungsfehler in eine statische Datei eingebunden
Was ich getan habe, um Python-Speicher zu speichern
Wovon ich in Kapitel 3 der kollektiven Intelligenz abhängig war. Es ist kein Tippfehler, daher denke ich, dass etwas mit meinem Code nicht stimmt.
FBX SDK Welche Fähigkeiten benötige ich, um ein Programm mit Python zu erstellen?
Ich möchte Twitter mit Python twittern, bin aber süchtig danach
Eine Geschichte, die ich süchtig danach war, eine Video-URL mit Tweepy zu bekommen
Mit Docker durchgeführte Umgebungswartung (Ich möchte GrADS in Python nachbearbeiten
Laden Sie das, was Sie angefordert haben, mit AWS Lambda Python in S3 hoch
[Bei Coder] Was ich getan habe, um den grünen Rang in Python zu erreichen
Was soll ich verwenden, um Typvergleiche in Python durchzuführen?