Typeerror: объект типа float32 не сериализуемый json

Я работаю с номерами numpy.float32, и они не входят в JSON. Каков правильный подход к решению этой проблемы?

import numpy as np
import json

a = np.float32(1)
json.dumps(a)

TypeError: Object of type 'float32' is not JSON serializable

Принятый ответ фактически создает строку сериализованного объекта, которая на самом деле является строкой json, но не объектом. Я обнаружил, что json.dumps(eval(str(a))) выдаст желаемый результат

Peavey 12.12.2020 13:50
61
1
65 966
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это должна быть строка, поэтому у вас может быть:

json.dumps(str(a))

Обновлено:

JSON - это формат для сериализации данных объекта. На самом деле он не заботится о типах Python и не знает их, пакет json пытается преобразовать любой объект, который вы передаете json.dumps(), в строковую форму через conversion table, который поддерживает только некоторые типы (см. Документ ниже).

Вот почему я считаю хорошей идеей просто передать строку, чтобы избежать этой проблемы: numpy.float32 просто отсутствует в таблице.

Поскольку некоторые отметили, что явная передача строки в dumps "звучит неправильно", я просто добавлю сюда документ.

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) Serialize obj to a JSON formatted str using this conversion table. The arguments have the same meaning as in dump().

Note Keys in key/value pairs of JSON are always of the type str. When a dictionary is converted into JSON, all the keys of the dictionary are coerced to strings. As a result of this, if a dictionary is converted into JSON and then back into a dictionary, the dictionary may not equal the original one. That is, loads(dumps(x)) != x if x has non-string keys.

взято из официальных документов здесь: https://docs.python.org/3/library/json.html

Это изменит тип a на строку. Если вы хотите сохранить a как число, используйте json.dumps(a.item()).

Domenico De Felice 17.11.2018 10:28

Если вам не нужно, чтобы данные в вашем приложении были в формате numpy с плавающей запятой (что характерно для большинства приложений), я предлагаю вам преобразовать результаты numpy ops, которые возвращают np.float32, в float, прежде чем добавлять их в свой dicts / lists, которые вы позже захотите сериализовать; например, dict_to_be_jsoned[key0] = float(np.somefunc(...))

Oliver Zendel 09.04.2019 15:27

Государственные деятели, что "это должна быть строка" кажется неправильным, @DomenicoDeFelice предложил лучшее решение в своем комментарии.

Danijel 20.11.2019 11:28

@Danijel см. Правку выше

vencaslac 20.11.2019 13:34
json.dumps(a.astype(float))
mac13k 28.12.2019 18:24

или json.dumps(float(a))

Jonathan 01.12.2020 15:59

@Jonathon @ mac13k В данном случае a - это простое число, но в целом это может быть более сложная структура данных, совместимая с json, например, целый словарь. Так что простое приведение - не самый расширяемый подход

Jordan Simba 02.12.2020 14:59

добавить к комментарию @ JordanSimba для mac13k и Джонатана вариант использования, включающий numpy.float32, на самом деле проиграет от преобразования в собственный float, поскольку вы потеряете точность с плавающей запятой

vencaslac 02.12.2020 15:32

Вот как это сработало для меня. json.dumps (eval (str (final_output)))

Wesam Na 03.01.2021 12:10

Как заметил Оливер Зендель, гораздо проще преобразовать в плавающее.

Wok 31.01.2021 18:18

если вы конвертируете в float, вы настраиваете себя для ошибок с плавающей запятой, которых был создан numpy.float32, чтобы избежать, просто конвертируйте в строку ... это действительно экономит много хлопот

vencaslac 04.02.2021 21:45

Другие вопросы по теме