gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:47 25 4
gpt4 key购买 nike

我已经将我们的真实案例简化为一个更简单的案例(现在看起来可能有点构建,但希望更容易理解)。基本上我们有一个松散类型的数组 object[]其中可能包含 decimal 的混合物和 double值以及各种其他对象(字符串、日期、其他原语、嵌套数组、自定义类等)。我们希望使用 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。 JSON 中的值只有:

  • 数字(整数和非整数之间没有区别)
  • 字符串
  • 对象
  • 数组
  • bool 真/假
  • null

  • 而已。

    因此,在不破坏 JSON 的情况下可靠地保留额外信息的唯一方法是将值序列化为具有类型信息的对象,根据您的
    { "type": "Decimal", "value": 2.0 }

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

    关于c# - Json.NET - 保留双/十进制数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35555548/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com