Python - Konvertiert ein Byte-Array in das JSON-Format

75

Ich möchte ein bytesArray in das JSON-Format konvertieren. Dies ist die Quelle, die ich habe:

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\'}]'

Und das ist das gewünschte Ergebnis, das ich haben möchte:

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

Zuerst habe ich die Bytes in einen String konvertiert:

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

aber wenn ich versuche, in JSON zu laden:

my_json = json.loads(my_new_string_value)

Ich erhalte diesen Fehler:

json.decoder.JSONDecodeError: Expecting value: line 1 column 174 (char 173)
Merouane Benthameur
quelle
Das wichtigste zuerst. Bytes zu String, dann String zu JSON
OneCricketeer
Ich habe die Bytes mithilfe von in einen String konvertiert, .decode("utf-8")aber wenn ich versuche, den String in JOSN zu konvertieren, erhalte ich den folgenden Fehler: json.decoder.JSONDecodeError: Erwarteter Wert: Zeile 1 Spalte 174 (char 173)
Merouane Benthameur
Können Sie Ihre Frage mit dem entsprechenden Code aktualisieren und die dekodierte Zeichenfolge ausdrucken?
OneCricketeer
1
Und woher bekommst du diesen Json?
OneCricketeer
6
@MerouaneBenthameur Der Grund dafür ist, dass die Zeichenfolge, die Sie haben, nicht JSON ist. Das offensichtlichste ist, dass JSON "nicht verwendet '.
freakish

Antworten:

118

Ihr bytesObjekt ist fast JSON, verwendet jedoch einfache Anführungszeichen anstelle von doppelten Anführungszeichen und muss eine Zeichenfolge sein. So eine Möglichkeit , es zu beheben , ist die dekodieren byteszu strund ersetzen Sie die Anführungszeichen. Eine andere Option ist zu verwenden ast.literal_eval; siehe unten für Details. Wenn Sie das Ergebnis drucken oder als gültigen JSON in einer Datei speichern möchten, können Sie den JSON in eine Python-Liste laden und dann ausgeben. Z.B,

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)

Ausgabe

[{"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
    }
]

Wie Antti Haapala in den Kommentaren erwähnt, können wir ast.literal_evaleine Konvertierung my_bytes_valuein eine Python-Liste durchführen, sobald wir sie in eine Zeichenfolge dekodiert haben.

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)

Im Allgemeinen tritt dieses Problem auf, weil jemand Daten durch Drucken seines Pythons gespeichert hat, repranstatt das jsonModul zum Erstellen der richtigen JSON-Daten zu verwenden. Wenn es möglich ist, ist es besser, dieses Problem zu beheben, damit zunächst die richtigen JSON-Daten erstellt werden.

PM 2Ring
quelle
5
Ich glaube nicht, dass es sich um einen JSON-String handelt, sondern um einen Python-Repr. Verwenden Sie stattdessen literal_eval
Antti Haapala,
0

Um dieses Bytesarray direkt in json zu konvertieren, können Sie zuerst das Bytesarray in einen String mit decode () konvertieren. Utf-8 ist Standard. Ändern Sie die Anführungszeichen. Der letzte Schritt besteht darin, das "aus der ausgegebenen Zeichenfolge zu entfernen, um das json-Objekt von der Zeichenfolge in die Liste zu ändern.

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

Sie können einfach verwenden,

import json

json.loads(my_bytes_value)
Chaithanya Krishna
quelle