Ce à quoi j'étais accro avec json.dumps dans l'encodage base64 de Python

introduction

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.

Données préparées

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```.

Préparation du codage des données

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
        }

encodage des données

É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

Conversion en Json

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)

Stratégie 1

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 ''.

Stratégie 2

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

à la fin

Cela semble un peu désorganisé, mais j'ai écrit un article pour savoir où j'ai été vaincu.

référence

(1) Python: gérer les binaires avec JSON

Recommended Posts

Ce à quoi j'étais accro avec json.dumps dans l'encodage base64 de Python
J'étais accro au grattage avec Selenium (+ Python) en 2020
Ce que j'étais accro à Python autorun
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
Ce à quoi j'étais accro lorsque l'utilisateur de traitement est passé à Python
Ce à quoi j'étais accro en présentant ALE à Vim pour Python
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
Ce à quoi j'étais accro en traitant d'énormes fichiers dans un environnement Linux 32 bits
J'étais accro à la création d'un environnement Python venv avec VS Code
Utilisez Python de Java avec Jython. J'étais aussi accro.
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
Ce à quoi j'étais accro lors de la création d'applications Web dans un environnement Windows
Encodage base64 des images en Python 3
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
Je veux travailler avec un robot en python.
pickle Pour lire ce qui a été fait en 2 séries avec 3 séries
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
Ce que j'ai appris en Python
Python: peut être répété en lambda
J'étais accro à essayer logging.getLogger avec Flask 1.1.x
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Ce à quoi j'étais accro en combinant l'héritage de classe et l'héritage de table commune dans SQLAlchemy
Ce que j'ai fait quand j'étais en colère de le mettre avec l'option enable-shared
[IOS] Animation GIF avec Pythonista3. J'en étais accro.
Ce que j'ai fait pour accueillir le Python2 EOL en toute confiance
[Réparer] J'étais accro au jugement alphanumérique des chaînes Python
Que faire avec la sortie de PYTHON?
Je veux déboguer avec Python
J'étais accro au multitraitement + psycopg2
Je veux résoudre APG4b avec Python (seulement 4.01 et 4.04 au chapitre 4)
J'ai essayé de résumer ce qui était sorti avec Qiita avec Word cloud
Une note à laquelle j'étais accro lors de la création d'une table avec SQL Alchemy
J'ai essayé d'implémenter PLSA en Python
Quand j'ai essayé de gratter en utilisant des requêtes en python, j'étais accro à SSLError, donc un mémo de contournement
Essayez de vous connecter à qiita avec Python
J'ai essayé d'implémenter la permutation en Python
J'ai essayé d'implémenter PLSA dans Python 2
Pour définir le codage par défaut sur utf-8 en python
J'étais accro à pip installer mysqlclient
Je voulais résoudre ABC160 avec Python
Comment utiliser BigQuery en Python
Je veux analyser les journaux avec Python
J'étais accro à Flask sur dotCloud
Je veux jouer avec aws avec python
J'ai essayé d'implémenter ADALINE en Python
Je voulais résoudre ABC159 avec Python
J'ai essayé d'implémenter PPO en Python
Ce que j'ai fait avec les tableaux Python
Pour faire fonctionner la station d'horodatage en Python
Je voulais résoudre ABC172 avec Python
Lorsque j'ai mis Django dans mon répertoire personnel, je suis devenu accro à un fichier statique avec une erreur d'autorisation
Ce que j'ai fait pour économiser la mémoire Python
Ce à quoi j'étais accro dans Collective Intelligence Chaprter 3. Ce n'est pas une faute de frappe, donc je pense que quelque chose ne va pas avec mon code.
FBX SDK De quelles compétences ai-je besoin pour créer un programme à l'aide de Python?
Je veux tweeter Twitter avec Python, mais j'y suis accro
Une histoire à laquelle j'étais accro à essayer d'obtenir une URL de vidéo avec tweepy
Maintenance de l'environnement réalisée avec Docker (je souhaite post-traiter GrADS en Python
Téléchargez ce que vous avez dans la demande vers S3 avec AWS Lambda Python
[Chez Coder] Ce que j'ai fait pour atteindre le rang vert en Python
Après tout, que dois-je utiliser pour faire des comparaisons de types en Python?