Получение "TypeError: Объект типа IFDRational не является JSON сериализуемым" при попытке json.dumps EXIF info
Я пытаюсь извлечь информацию EXIF из изображения и сохранить ее в виде JSONField
.
Это хорошо работает для некоторых типов изображений, но не для других.
Ниже мой код:
image_open = Image.open(self.image)
image_open.verify()
image_getexif = image_open.getexif()
if image_getexif:
exif = {
ExifTags.TAGS[k]: v for k, v in image_getexif.items() if k in ExifTags.TAGS and type(v) is not bytes]
}
print(json.dumps(exif, indent=4))
Я получаю TypeError: Object of type IFDRational is not JSON serializable
при попытке json.dumps()
.
При создании дампа exif dict я заметил, что он довольно стандартный, поэтому не уверен, в чем дело.
{'ResolutionUnit': 2, 'ExifOffset': 204, 'Make': 'Apple', 'Model': 'iPhone 13', 'Software': '15.3.1', 'Orientation': 1, 'DateTime': '2022:03:04 17:35:15', 'XResolution': 72.0, 'YResolution': 72.0, 'HostComputer': 'iPhone 13'}
Проверяя type
на каждом из элементов, можно увидеть, что некоторые элементы в дикте на самом деле имеют тип PIL.TiffImagePlugin.IFDRational
.
for (k, v) in image_getexif.items():
print(k, type(k))
print(v, type(v))
Вывод:
296 <class 'int'>
2 <class 'int'>
34665 <class 'int'>
204 <class 'int'>
271 <class 'int'>
Apple <class 'str'>
272 <class 'int'>
iPhone 13 <class 'str'>
305 <class 'int'>
15.3.1 <class 'str'>
274 <class 'int'>
1 <class 'int'>
306 <class 'int'>
2022:03:04 17:35:15 <class 'str'>
282 <class 'int'>
72.0 <class 'PIL.TiffImagePlugin.IFDRational'>
283 <class 'int'>
72.0 <class 'PIL.TiffImagePlugin.IFDRational'>
316 <class 'int'>
iPhone 13 <class 'str'>
{}
<class 'dict'>
{}
Добавьте их к исключениям (или отбросьте их в int
, если требуется), и все готово.
if k in ExifTags.TAGS and type(v) not in [bytes, TiffImagePlugin.IFDRational]
Импортируйте TiffImagePlugin из PIL:
from PIL import Image, ExifTags, TiffImagePlugin