Vous souhaiterez peut-être renvoyer des données encodées en base64 lors de la création d'API, n'est-ce pas? Cette fois, j'étais accro, alors je l'ai laissé de côté. Puisque les pensées sont écrites comme bâclées, si vous l'écrivez brièvement
data_bytes = bytes('Akanechan Kawaii Yatta', 'utf-8')
data_encode_bytes = base64.b64encode(data_bytes)
data_encode_str = data_encode_bytes.decode('utf-8')
Ces trois lignes sont le résultat.
En Python, le type Dict et Json ont la même forme, donc après traitement avec le type Dict, qui est facile à traiter, il est finalement converti en Json.
akane_dict = {
'kind': 'voiceroid',
'data': 'Akanechan Kawaii Yatta'
}
Il est emballé de différentes manières. Cette fois, je veux encoder `'data'
avec base64 et faire
`json.dumps```.
Rendre les `` 'données' '
`de type octets à encoder.
data_bytes = b'Akanechan Kawaii Yatta'
akane_dict = {
'kind': 'voiceroid',
'data': data_bytes
}
Ce n'est pas bien.
data = b'Akanechan Kawaii Yatta'
^
SyntaxError: bytes can only contain ASCII literal characters.
'Akanechan Kawaii Yatta'
N'est pas ascii, donc c'est naturel (1 perte)
Je tape des caractères en UTF-8 pour l'entrée VS Code, donc cela semble fonctionner.
data_bytes = bytes('Akanechan Kawaii Yatta', 'utf-8')
akane_dict = {
'kind': 'voiceroid',
'data': data_bytes
}
Étant donné que base64 est inclus en standard, vous pouvez l'importer tel quel.
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) #Pour confirmation
Nous allons convertir le type Dict en Json.
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)
L'erreur suivante se produit.
TypeError: Object of type bytes is not JSON serializable
Cela ne peut pas être converti en Json s'il reste du type bytes! Vous vous fâcherez, vous devez donc le convertir en type str. (2 pertes)
C'est un casting qui semble changer le type de str! Alors ce sera comme ça.
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)
#Envoyer
akane_json = json.dumps(akane_dict)
#Recevoir
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
Je suis d'accord. Si vous lancez le type str, ce sera comme ça. Jetons un coup d'œil au contenu de `` res ''.
{'kind': 'voiceroid', 'data': "b'44Ki44Kr44ON44OB44Oj44Oz44Kr44Ov44Kk44Kk44Ok44OD44K/'"}
Il est peut-être possible de l'envoyer, mais il semble impossible de décoder les `` données ''.
Article (1) a été trouvé, alors consultez-le et modifiez le code comme suit
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)
#Envoyer
akane_json = json.dumps(akane_dict)
#Recevoir
res = json.loads(akane_json)
res_data = base64.b64decode(res['data']).decode('utf-8')
print(res_data)
La chose étrange ici est que le type bytes est décodé par utf8 en une chaîne de caractères. Je ne comprends pas pourquoi je devrais faire cela en raison d'un manque d'étude, mais si je fais cela, json.dumps fonctionnera bien et le côté récepteur ne pourra pas s'en débarrasser avec une erreur. Du côté de la réception, il n'est pas nécessaire de décoder avec utf8 s'il est traité comme du type octets. Puis afficher
{'kind': 'voiceroid', 'data': '44Ki44Kr44ON44OB44Oj44Oz44Kr44Ov44Kk44Kk44Ok44OD44K/'}
Akanechan Kawaii Yatta
Ouais, ça a l'air bien
Cela semble un peu désorganisé, mais j'ai écrit un article pour savoir où j'ai été vaincu.
(1) Python: gérer les binaires avec JSON
Recommended Posts