Ошибка типа: объект типа bytes не является сериализуемым в формате JSON — python 3 — попробуйте опубликовать данные изображения в base64

#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:

Я сделаю это в двухэтапный процесс:

  1. Сначала закодируйте файл изображения в BASE64
  2. Затем декодируйте закодированный файл

А затем передайте обратно данные в формате JSON, используя декодированный файл.

Вот пример:

Допустим, файл изображения является is_image_file

  1. Закодируйте файл изображения с помощью:

enc_image_file = base64.b64encode(is_image_file.read())

  1. Затем расшифруйте его с помощью:

send_image_file = enc_image_file.decode()

Наконец, передайте data using send_image_file как JsonResponse туда, где он будет использоваться.

Конечно, добавьте import base64 перед вызовом функции.

Примечание: При использовании json.dumps(dict_data) получается строка, которая не будет загружать изображения.