#json #python-3.x
#json #python-3.x
Вопрос:
я получил эту ошибку после попытки преобразовать данные в json для запроса post
Ошибка типа: объект типа ‘bytes’ не сериализуем в формате JSON
мой код
dict_data: dict = {
'img': base64.b64encode(urlopen(obj['recognition_image_path']).read())
}
json_data: str = json.dumps(dict_data)
я прочитал изображение из URL, преобразовал его в base64, после того, как я получил ошибку при попытке преобразовать данные в json.
Пожалуйста, помогите
Комментарии:
1. Я тоже получаю это — но только при запуске в Docker!
Ответ №1:
string
Сначала вам нужно преобразовать в, вызвав .decode
, так как вы не можете JSON-сериализовать bytes
, не зная его кодировку.
( base64.b64encode
возвращает a bytes
, а не a string
.)
import base64
from urllib.request import urlopen
import json
dict_data: dict = {
'img': base64.b64encode(urlopen(obj['recognition_image_path']).read()).decode('utf8')
}
json_data: str = json.dumps(dict_data)
редактировать: переписать ответ, чтобы ответить на актуальный вопрос, закодировать / декодировать
Ответ №2:
Я сделаю это в двухэтапный процесс:
- Сначала закодируйте файл изображения в BASE64
- Затем декодируйте закодированный файл
А затем передайте обратно данные в формате JSON, используя декодированный файл.
Вот пример:
Допустим, файл изображения является is_image_file
- Закодируйте файл изображения с помощью:
enc_image_file = base64.b64encode(is_image_file.read())
- Затем расшифруйте его с помощью:
send_image_file = enc_image_file.decode()
Наконец, передайте data
using send_image_file
как JsonResponse туда, где он будет использоваться.
Конечно, добавьте import base64
перед вызовом функции.
Примечание: При использовании json.dumps(dict_data)
получается строка, которая не будет загружать изображения.