Кодер Python NaN JSON

Поведение по умолчанию для кодера JSON заключается в преобразовании NaN в «NaN», например, json.dumps (np.NaN) приводит к «NaN». Как я могу изменить это значение «NaN» на «null»?

Я попытался подклассифицировать JSONEncoder и реализовать метод default () следующим образом:

from json import JSONEncoder, dumps import numpy as np class NanConverter(JSONEncoder): def default(self, obj): try: _ = iter(obj) except TypeError: if isinstance(obj, float) and np.isnan(obj): return "null" return JSONEncoder.default(self, obj) >>> d = {'a': 1, 'b': 2, 'c': 3, 'e': np.nan, 'f': [1, np.nan, 3]} >>> dumps(d, cls=NanConverter) '{"a": 1, "c": 3, "b": 2, "e": NaN, "f": [1, NaN, 3]}' 

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ: '{"a": 1, "c": 3, "b": 2, "e": null, "f": [1, null, 3]}'

4 Solutions collect form web for “Кодер Python NaN JSON”

Это, похоже, достигает моей цели:

 import simplejson >>> simplejson.dumps(d, ignore_nan=True) Out[3]: '{"a": 1, "c": 3, "b": 2, "e": null, "f": [1, null, 3]}' 

К сожалению, вам, вероятно, нужно использовать предложение @ Bramar. Вы не сможете использовать это напрямую. Документация для кодера JSON Python гласит:

Если указано, значение по умолчанию – это функция, которая вызывается для объектов, которые иначе не могут быть сериализованы

Ваш метод NanConverter.default даже не вызывается, поскольку кодер JSON от Python уже знает, как сериализовать np.nan . Добавьте несколько операторов печати – вы увидите, что ваш метод даже не вызывается.

  1. Как отмечает @Gerrat, ваши dumps(d, cls=NanConverter) к сожалению, не будут работать.

  2. @ Alexander simplejson.dumps(d, ignore_nan=True) работает, но вводит дополнительную зависимость ( simplejson ).

Если ввести другую зависимость (панды):

  1. Еще одно очевидное решение – это dumps(pd.DataFrame(d).fillna(None)) , но Pandas issue 1972 отмечает, что d.fillna(None) будет иметь непредсказуемое поведение:

    Обратите внимание, что fillna(None) эквивалентно fillna() , что означает, что параметр значения не используется. Вместо этого он использует параметр метода, который по умолчанию является прямым заполнением.

  2. Вместо этого используйте DataFrame.where :

     df = pd.DataFrame(d) dumps(df.where(pd.notnull(df), None))) 

simplejson выполнит правильную работу здесь, но есть еще один дополнительный флаг, включая:

Попробуйте использовать simplejson:

 pip install simplejson 

Затем в коде:

 import simplejson response = df.to_dict('records') simplejson.dumps(response, ignore_nan=True,default=datetime.datetime.isoformat) 

Флаг ignore_nan будет корректно обрабатывать все преобразования NaN -> null

Флаг по умолчанию позволит simplejson правильно анализировать ваши даты .

  • Каковы значения веса для использования в numpy polyfit и какова ошибка пригонки
  • Ненужный рулон в нескольких размерах
  • получение противоположной диагонали множества numpy
  • UV-отображение плохо работает при низком разрешении (предупреждение: много изображений)
  • Давайте сделаем ссылочную реализацию N-мерного пиксельного биннинга / bucketing для numpy python
  • 2d с использованием python и numpy
  • «Isnotnan» функциональность в numpy, может ли это быть более pythonic?
  • Отображение данных из двоичного файла в python
  •  
    Interesting Posts for Van-Lav

    Python: Amazon S3 не может получить ведро: говорит 403 Запрещено

    Алгоритм определения победителя Техасского Холдема

    как получить кнопку pygame, чтобы зарегистрировать только один клик?

    Кодировать Декодирование строк python

    Почему функции matplotlib imshow () и show () показывают изображения в другой цветовой схеме в зависимости от того, читаются ли они как uint8 или in64?

    синтаксический анализ json-полей в python

    Вычислить среднее из каждых x строк в таблице и создать новую таблицу

    Является ли '#! / Usr / bin / python' перед каждым скриптом Python обязательным?

    Гифы, открытые с помощью python, имеют разбитые кадры

    Кнопка изменения или цвет текста ярлыка в киви

    Numpy: Максимальное значение – NaN

    Приведение модели ARMA к временным рядам, индексированным по времени в python

    Выбор даты из импортированного CSV с помощью pandas / python

    сборка мусора python о списке добавляет себя

    ПРЕДУПРЕЖДЕНИЕ (theano.sandbox.cuda): CUDA установлен, но устройство gpu недоступно (ошибка: cuda недоступна)

    Python - лучший язык программирования в мире.