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.
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.
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
}
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
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)
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.
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
Es scheint ein wenig unorganisiert zu sein, aber ich habe einen Artikel geschrieben, um herauszufinden, wo ich besiegt wurde.
(1) Python: Binärdateien mit JSON verarbeiten
Recommended Posts