Подтвердить что ты не робот

Python - преобразовать массив байтов в формат JSON

Я хочу преобразовать массив байтов в формат 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\'}]'

и это желаемый результат, который я хочу иметь:

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

спасибо за помощь

ИЗМЕНИТЬ:

Сначала я преобразовал байты в строку:

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

но когда я пытаюсь загрузить JSON: my_json = json.loads(my_new_string_value) Я получаю эту ошибку: json.decoder.JSONDecodeError: Ожидающее значение: строка 1 столбец 174 (char 173)

4b9b3361

Ответ 1

Ваш объект bytes - это почти JSON, но он использует одинарные кавычки вместо двойных кавычек и должен быть строкой. Поэтому вам просто нужно его расшифровать и заменить кавычки. Если вы хотите распечатать его или сохранить в файл как действительный JSON, вы можете загрузить JSON в список Python и затем выгрузить его. Например,

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)

Выход

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

Как отмечает Антти Хаапала в комментариях, мы можем использовать ast.literal_eval для преобразования my_bytes_value в список Python, как только мы его декодируем в строку.

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)

Ответ 2

Чтобы преобразовать этот байтар непосредственно в json, вы можете сначала преобразовать bytesarray в строку с decode(), utf-8 является стандартным. Измените маркеры котировок. Последний шаг - удалить "из сбрасываемой строки", чтобы изменить объект json из строки в список.

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