【发布时间】:2015-04-22 18:42:48
【问题描述】:
我正在编写代码来接收能够转换为 JSON 的任意对象(可能是嵌套的)。
Python 内置 JSON 编码器的默认行为是将 NaN 转换为 NaN,例如json.dumps(np.NaN) 导致 NaN。如何将此 NaN 值更改为 null?
我尝试subclass JSONEncoder and override the default() method如下:
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]}'
【问题讨论】:
-
编码前为什么不直接替换字典中的
NaNs? -
我收到了一个能够转换为 JSON 的任意对象,并且没有直接对其进行编码。但是,我想确保在创建 JSON 字符串表示时将 NaN 转换为 null。
-
我在想这是否是 JSON 编码器中的错误,因为它会产生无效的 JSON。 {"x": NaN} 在语法上是不正确的 JSON IMO。它应该输出 {"x": "NaN"} 或 {"x": null}。两者在语法上都是有效的 - 其中哪个更有意义是一个不同的问题。