如何让serde_json处理IEEE 754特殊值?含替代方案咨询
关于serde_json处理IEEE 754特殊浮点数的问题
官方JSON规范并不支持IEEE 754标准中的特殊浮点数(无穷大、负无穷大、非数值NaN),仅允许使用null或常规数字。但不少编程语言和使用场景会绕过这一规范,直接支持这类特殊浮点数的序列化:
- Python中,
json.dumps的allow_nan参数默认值为True,可以直接序列化特殊浮点数:
>>> json.dumps(dict(a = np.inf, b = -np.inf, c = np.nan), allow_nan=True) '{"a": Infinity, "b": -Infinity, "c": NaN}'
- C#中,可通过设置数字处理选项为
AllowNamedFloatingPointLiterals实现相同行为。
核心问题
在Rust的serde_json中,如何实现上述兼容IEEE 754特殊浮点数的序列化功能?serde_json是否提供了对应的配置项?如果没有,无需修改或fork serde_json源码的情况下,用户最简单的实现方式是什么?
补充疑问
如果认为JSON本身存在不足,有没有可以完全支持浮点数的替代序列化格式?
或者,如何实现一种符合JSON规范的替代方案(比如将"Infinity"这类特殊值转为字符串),同时不影响其他序列化格式(如BSON、CBOR、msgpack等)的正常使用?
调研后的进一步疑问
我自己调研发现两种可能的方向,想确认是否可行:
- JSON5是JSON的扩展格式,同时保持向后兼容,是否适合用来处理特殊浮点数?
- 能否通过serde的无标签枚举实现特殊处理逻辑?比如让serde_json在序列化特殊浮点数时触发失败(严格遵循JSON规范),进而触发fallback处理?
内容的提问来源于stack exchange,提问作者Corvus
相关产品推荐
相关产品推荐

