官方的JSON规范不支持IEEE754,而是有自己的NULL(非"NULL")或普通数字约定.
在许多语言和用例中,人们忽略了这一点,并偏离了支持IEEE754浮点的规范.例如,在Python中
>>> json.dumps(dict(a = np.inf, b = -np.inf, c = np.nan), allow_nan=True)
'{"a": Infinity, "b": -Infinity, "c": NaN}'
在本例中,Allow_NaN默认为True.
同样,在C#中,我们可以将数字处理设置为AllowNamedFloatingPointWritals以获得相同的行为
那么,我们如何才能让rust/serde_json做同样的事情--serde_json中是否有这样做的标志,如果没有,添加此功能的最简单方法是什么?(我的意思是以用户身份实现此功能,而不是通过更新serde_json源代码或派生它或任何其他方式).
一百:根据一些 comments ,假设我们同意JSON是错误的,是否有一种格式可以代替JSON,完全支持浮点数.
或者,如何实现JSON有效的替代方案,如将"Infinity"用作字符串.据我所知,这会影响所有其他序列化,所以如果您将 struct 序列化为bson、cbor、msgpack等.
Edit again个
因此,我自己的研究提出了几种可能性:
- JSON5显然在JSON上进行了扩展,同时是向后兼容的.
- 可能有一些魔术可以用serde未标记的枚举来完成,但我不知道这是不是真的.似乎serde可以依次try 一系列格式,直到其中一个成功--如果serde_json试图序列化一个Special Float(严格地说,这是JSON规范说它应该做的事情),有没有办法让它失败.如果是这样的话,也许我们可以利用这一点作为后盾?