101 votes

Python - Convertit un tableau d'octets au format JSON

Je veux convertir un tableau d'octets au format JSON, c'est la source que j'ai:

 my_bytes_value = b'[{\'Date\': \'2016-05-21T21:35:40Z\', \'CreationDate\': \'2012-05-05\', \'LogoType\': \'png\', \'Ref\': 164611595, \'Classe\': [\'Email addresses\', \'Passwords\'],\'Link\':\'http://some_link.com\'}]'
 

et c'est le résultat souhaité que je veux avoir:

 [{
"Date": "2016-05-21T21:35:40Z",
"CreationDate": "2012-05-05",
"LogoType": "png",
"Ref": 164611595,
"Classes": [
  "Email addresses",
  "Passwords"
],
"Link": "http://some_link.com"}]
 

Merci de votre aide

MODIFIER:

D'abord, j'ai converti les octets en chaîne:

 my_new_string_value = my_bytes_value.decode("utf-8")
 

mais quand j'essaye de charger en JSON: my_json = json.loads(my_new_string_value) j'obtiens cette erreur: json.decoder.JSONDecodeError: valeur attendue: ligne 1 colonne 174 (caractère 173)

155voto

PM 2Ring Points 11424

Votre bytes objet est presque JSON, mais c'est d'utiliser des guillemets simples au lieu de guillemets doubles, et il doit être une chaîne de caractères. Vous avez juste besoin de le décoder et de remplacer les guillemets. Si vous souhaitez l'imprimer ou l'enregistrer dans un fichier JSON valide, vous pouvez charger le JSON pour une liste Python, puis la jeter dehors. Par exemple,

import json

my_bytes_value = b'[{\'Date\': \'2016-05-21T21:35:40Z\', \'CreationDate\': \'2012-05-05\', \'LogoType\': \'png\', \'Ref\': 164611595, \'Classe\': [\'Email addresses\', \'Passwords\'],\'Link\':\'http://some_link.com\'}]'

# Decode UTF-8 bytes to Unicode, and convert single quotes 
# to double quotes to make it valid JSON
my_json = my_bytes_value.decode('utf8').replace("'", '"')
print(my_json)
print('- ' * 20)

# Load the JSON to a Python list & dump it back out as formatted JSON
data = json.loads(my_json)
s = json.dumps(data, indent=4, sort_keys=True)
print(s)

sortie

[{"Date": "2016-05-21T21:35:40Z", "CreationDate": "2012-05-05", "LogoType": "png", "Ref": 164611595, "Classe": ["Email addresses", "Passwords"],"Link":"http://some_link.com"}]
- - - - - - - - - - - - - - - - - - - - 
[
    {
        "Classe": [
            "Email addresses",
            "Passwords"
        ],
        "CreationDate": "2012-05-05",
        "Date": "2016-05-21T21:35:40Z",
        "Link": "http://some_link.com",
        "LogoType": "png",
        "Ref": 164611595
    }
]

Comme Antti de la Haapala mentionne dans les commentaires, on peut utiliser ast.literal_eval convertir my_bytes_value pour une liste Python, une fois que nous avons décodé à une chaîne.

from ast import literal_eval
import json

my_bytes_value = b'[{\'Date\': \'2016-05-21T21:35:40Z\', \'CreationDate\': \'2012-05-05\', \'LogoType\': \'png\', \'Ref\': 164611595, \'Classe\': [\'Email addresses\', \'Passwords\'],\'Link\':\'http://some_link.com\'}]'

data = literal_eval(my_bytes_value.decode('utf8'))
print(data)
print('- ' * 20)

s = json.dumps(data, indent=4, sort_keys=True)
print(s)

1voto

Simon Points 316

Pour convertir ce bytesarray directement en json, vous pouvez d’abord convertir le bytesarray en chaîne avec decode (), utf-8 étant standard. Changer les guillemets .. La dernière étape consiste à supprimer le "de la chaîne déchargée, pour changer l'objet Json de chaîne en liste.

 dumps(s.decode()).replace("'", '"')[1:-1]
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X