web-dev-qa-db-fra.com

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 dans 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)

41

Votre objet bytes est presque (JSON) , mais il utilise des guillemets simples au lieu de guillemets doubles et doit être une chaîne. Il suffit donc de le décoder et de remplacer les guillemets. Si vous souhaitez l'imprimer ou l'enregistrer dans un fichier au format JSON valide, vous pouvez le charger dans une liste Python, puis le vider. 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 Haapala le mentionne dans les commentaires, nous pouvons utiliser ast.literal_eval pour convertir my_bytes_value en une liste Python, une fois que nous l'avons décodé en 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)
62
PM 2Ring

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]
0
Simon