官方的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以获得相同的行为

https://learn.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonnumberhandling?view=net-8.0

那么,我们如何才能让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规范说它应该做的事情),有没有办法让它失败.如果是这样的话,也许我们可以利用这一点作为后盾?

推荐答案

可以让102来处理这些特殊的浮球吗?不,因为它严格遵守JSON规范.然而,JSON5支持这些时髦的浮点,而serde_json5忠实地实现了JSON5:

use std::collections::HashMap;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let map = HashMap::<_, _>::from_iter([
        ("a", 1.0),
        ("b", f64::NAN),
        ("c", f64::INFINITY),
        ("d", f64::NEG_INFINITY),
    ]);

    let j = serde_json5::to_string(&map)?;
    let o = serde_json5::from_str::<HashMap<String, f64>>(&j)?;

    println!("JSON5: {}", j);
    println!("HashMap: {:?}", o);

    Ok(())
}

输出:

JSON5: {"a":1,"b":NaN,"d":-Infinity,"c":Infinity}
HashMap: {"a": 1.0, "d": -inf, "c": inf, "b": NaN}

Json相关问答推荐

将json数组反序列化为选项 struct

与错误相关的未定义&Quot;不是有效的JSON

修改Deneb图表中工具提示的字体大小

JQ-JSON将键转换为对象

Jolt 变换以展平 json 字符串数组

如何使用jolt将嵌套数据变成线性数据

xidel:是否可以从 JSON 对象中检索特定的嵌套值?

将 colly 包输出文本添加到 golang 中的映射

将 JSON 解组为具有唯一元素的 map 切片

Serde JSON 反序列化枚举

Powershell中等效的JSONPath通配符以 Select 对象中的所有数组

将哈希表转换为 json 后,Powershell 缺少数组

PowerShell - 如何迭代 PSCustomObject 嵌套对象?

应该使用什么标头将 GZIP 压缩 JSON 从 Android 客户端发送到服务器?

从多维数组数据生成json字符串

苗条的 JSON 输出

在 JSON 反序列化期间没有为System.String类型定义无参数构造函数

如何按键查找特定的 JSON 值?

如何转换为 D3 的 JSON 格式?

你如何在 Arrays of Arrays 上 OPENJSON