Дамп JSON с нечисловыми числами с плавающей запятой с помощью модуля Python ujson

Я пытаюсь сериализовать числа, используя модуль ujson в Python3. Некоторые значения равны NaNs.

При использовании стандартного модуля json все работает нормально.

import json
json.dumps(float('NaN'))

дает:

'NaN'

Но есть проблема с ujson.

import ujson
ujson.dumps(float('NaN'))

выдает исключение:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Invalid Nan value when encoding double

Я использую ujson из соображений производительности. Должен ли я заменить все вхождения NaN в моих структурах на строку 'NaN', или есть способ указать ujson обрабатывать NaNs без создания исключения?

У меня такие же проблемы с бесконечностями. Мне не удалось найти какие-либо соответствующие документы.


person Tregoreg    schedule 15.08.2014    source источник
comment
См., например. github.com/esnme/ultrajson/issues/80; на самом деле это более соответствует спецификации JSON.   -  person jonrsharpe    schedule 16.08.2014


Ответы (1)


Согласно RFC4627, определяющему формат JSON, в разделе 2.4 о номера:

Числовые значения, которые не могут быть представлены в виде последовательности цифр (например, бесконечность и NaN), не допускаются.

Таким образом, ujson больше соответствует стандарту JSON, чем модуль json в стандартной библиотеке. По мне этот результат излишне педантичен, но выбор ujson должен соответствовать этому стандарту. Подробнее об этом можно прочитать здесь.

Кажется, что единственный способ — преобразовать данные раньше (или отправить запрос на включение в ujson, чтобы включить его).

person enrico.bacis    schedule 15.08.2014