Json.NET - 保留双/十进制数据类型

本文关键字:十进制 数据类型 保留 NET Json | 更新日期: 2023-09-27 18:35:38

我已经将现实世界的案例简化为一个更简单的案例(现在可能看起来有点结构化,但希望更容易理解)。基本上,我们有一个松散类型的数组object[]其中可能包含decimaldouble值以及各种其他对象(字符串,日期,其他基元,嵌套数组,自定义类等)的混合。我们希望使用 Json.NET 将此类数组传输到远程计算机,并且我们希望将数值的原始 CLR 数据类型保留在接收端。问题在于,根据FloatParseHandling选项,所有数字要么转换为double,要么在反序列化后转换为decimal。知道基元的类型信息不是由序列化程序写入的,这并不奇怪,但我们不介意以任何方式将此信息添加到输出中(我们不需要互操作,两端都是我们自己的 C# 程序)。

您建议如何配置序列化程序以保留数值的类型?理想情况下(但不一定)我们需要尽可能小的格式,例如:

[
    "hello",
    1.0, // double
    2.0m, // decimal (preferable format, but unfortunately INVALID)
    { "$": "2.0m" }, // less readable, yet still compact enough
    { "type": "Decimal", "value": 2.0 }, // less pretty alternative, but would do as well...
    [
        // nested array or object
    ],
    // etc.
]

实现写入此类内容的JsonConverter似乎相对容易,但我们坚持实现ReadJson重载,该重载仅将自定义逻辑应用于带有"m"后缀的令牌,并回退到默认实现其他任何内容。

编辑 1:将我的"首选格式"标记为无效,添加了一个较短的有效替代方案,但最初的问题 - 如何在 Json.NET 中实现它 - 仍然悬而未决。

Json.NET - 保留双/十进制数据类型

您喜欢的格式根本不是 JSON。JSON 中的值仅为

  • 数字(整数和非整数之间没有区别)
  • 字符串
  • 对象
  • 阵 列
  • 布尔值真/假
  • null

就是这样。

因此,在不破坏 JSON 的情况下可靠地保留额外信息的唯一方法是将值序列化为具有类型信息的对象,

根据您的
{ "type": "Decimal", "value": 2.0 }

例。。。尽管在这种情况下,我会将值设置为字符串,否则您很容易丢失信息。(并非每个System.Decimal都可以完全表示为System.Double,反之亦然。