JSON 转储非数字浮点数与 Python 的 ujson 模块

Posted

技术标签:

【中文标题】JSON 转储非数字浮点数与 Python 的 ujson 模块【英文标题】:JSON dump non-numeric floats with Python's ujson module 【发布时间】:2014-10-09 15:52:20 【问题描述】:

我正在尝试使用 Python3 中的 ujson 模块对数字进行序列化。其中一些值为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?

我对无穷大也有同样的问题。我找不到任何相关文档。

【问题讨论】:

参见例如github.com/esnme/ultrajson/issues/80;这实际上与 JSON 规范更一致 【参考方案1】:

根据定义JSON格式的RFC4627,在2.4节中关于数字:

不允许使用不能表示为数字序列的数值(例如 InfinityNaN)。

所以ujson 比标准库中的json 模块更符合JSON 标准。在我看来,这个结果不必要地迂腐,但选择ujson 是为了符合这个标准。你可以阅读更多关于这个here的信息。

看来唯一的办法就是转换之前的数据(或者提交pull request到ujson启用)。

【讨论】:

以上是关于JSON 转储非数字浮点数与 Python 的 ujson 模块的主要内容,如果未能解决你的问题,请参考以下文章

python中的整数浮点数和布尔值

input框只能输入整数和浮点数非数字就不输入

带有前缀的Python熊猫数据框字符串转换为浮点数

在 C++ 中转储十六进制浮点数

python浮点数,即使全为零,也保留有效数字

Python从菜鸟到高手:数字