"TypeError: (Integer) не є серіалізацією JSON" при серіалізації JSON в Python?


162

Я намагаюся надіслати простий словник до файлу json з python, але я продовжую отримувати повідомлення "TypeError: 1425 - це не серіалізація JSON".

import json
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8'))
afile.close()

Якщо я додаю аргумент за замовчуванням, то він пише, але цілі значення записуються у файл json у вигляді рядків, що небажано.

afile.write(json.dumps(alerts,encoding='UTF-8',default=str))


1
Це питання, схоже, не "дублює" це питання ..

8
Я знайшов свою проблему. Проблема полягала в тому, що мої цілі числа насправді були типу numpy.int64.
користувач1329894

@ user1329894 Опублікувати як рішення / пояснення та самостійне закриття ..

-0 для написання мінімального запиту, який насправді не відтворює помилку.
Рассел Борогов

Відповіді:


268

Я знайшов свою проблему. Проблема полягала в тому, що мої цілі числа були насправді типом numpy.int64.


22
Мені довелося розібратися і з цим питанням, і ваша відповідь вказала мені в правильному напрямку. Я просто хотів додати посилання на ще одне питання, яке може допомогти у вирішенні проблеми.
JAC

19
Це було б добре, якби повідомлення про несеріалізаційну помилку JSON могло відобразити тип об’єкта ...
Franck Dernoncourt

6
Ось охайне рішення, яке використовує спеціальний серіалізатор.
Оуен

17
У цьому проблема, але яке рішення?
BallpointBen

5
x.astype (int) або int (x)
zelcon

50

Здається, може виникнути проблема з тим, щоб скинути numpy.int64 в рядок json в Python 3, і команда python вже веде розмову про це. Детальніше можна ознайомитись тут .

Є рішення, яке надає Сергій Сторчака. Він працює дуже добре, тому я вставляю його тут:

def convert(o):
    if isinstance(o, numpy.int64): return int(o)  
    raise TypeError

json.dumps({'value': numpy.int64(42)}, default=convert)

Прекрасне рішення, яке надав Сергій. Будь ласка, перевірте його підхід. І додати, просто: json.dumps (вашObject, типовий = за замовчуванням); як тут.
Пранцелл



3

як @JAC вказував у коментарях відповіді з найбільш високим рейтингом, загальне рішення (для всіх типів numpy) можна знайти у потоці Перетворення numpy-типів у натурні типи python .

Тим не менш, я додам свою версію рішення нижче, оскільки моя в моєму випадку мені знадобилося загальне рішення, яке поєднує ці відповіді та відповіді іншої нитки. Це повинно працювати майже з усіма типами нумерів.

def convert(o):
    if isinstance(o, np.generic): return o.item()  
    raise TypeError

json.dumps({'value': numpy.int64(42)}, default=convert)

Приємна відповідь справді
jtlz2

2

Це може бути пізня відповідь, але останнім часом я отримав таку ж помилку. Після багато серфінгу це рішення допомогло мені.

alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
def myconverter(obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, datetime.datetime):
            return obj.__str__()

Телефонуйте myconverterв , json.dumps()як показано нижче.json.dumps(alerts, default=myconverter).


1

Або ви можете спочатку перетворити об'єкт у кадр даних:

df = pd.DataFrame(obj)

а потім збережіть це dataframeу jsonфайлі:

df.to_json(path_or_buf='df.json')

Сподіваюся, це допомагає



0

Та ж проблема. Список містив номери типу numpy.int64, які видає TypeError. Швидке вирішення для мене було

mylist = eval(str(mylist_of_integers))
json.dumps({'mylist': mylist})

яка перетворює список у str (), а функція eval () оцінює "String" як вираз python і повертає результат у вигляді списку цілих чисел у моєму випадку.


Щойно помічений eval (str ()) дуже повільний, тому використовуйте з обережністю. Відповідь @ shiva набагато краща: json.dumps (сповіщення, за замовчуванням = myconverter)
користувач319436

0

використання

from numpyencoder import NumpyEncoder

щоб вирішити цю проблему в Python3:

import json
from numpyencoder import NumpyEncoder
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 
15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8',cls=NumpyEncoder))
afile.close()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.