我已将现实世界的案例简化为一个更简单的案例(现在可能看起来有点构建,但希望更容易理解)。基本上我们有一个松散类型的数组decimal
,它可能包含double
和FloatParseHandling
值以及各种其他对象(字符串,日期,其他基元,嵌套数组,自定义)的混合班级等)。我们希望使用Json.NET将这样的数组传输到远程机器,并且我们希望在接收端保留数值的原始CLR数据类型。问题在于,根据double
选项,反序列化后所有数字都会转换为decimal
或[
"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.
]
。知道原语的类型信息不是由序列化程序写的并不奇怪,但我们不介意以任何方式将这些信息添加到输出中(我们不需要互操作,两端都是我们自己的C#程序)。 / p>
您如何建议配置序列化程序以保留数值类型?理想情况下(但不一定)我们想要最小的格式,如:
JsonConverter
实现编写此类内容的ReadJson
似乎相对容易,但我们仍然坚持实施{{1}}重载,该重载仅将自定义逻辑应用于标记' m&#39 ;后缀并回退到其他任何内容的默认实现。
编辑1:标记了我的"首选格式"作为INVALID,添加了一个更短的有效替代品,但原始问题 - 如何在Json.NET中实现它 - 仍然是开放的。
答案 0 :(得分:8)
您首选的格式不仅仅是JSON。 JSON中的值仅 :
null
那就是它。
因此,在不破坏JSON的情况下可靠地保存额外信息的唯一方法是将值序列化为具有类型信息的对象,按照
{ "type": "Decimal", "value": 2.0 }
示例...虽然在这种情况下我将值设为字符串,否则您很容易丢失信息。 (并非每个System.Decimal
都可以完全表示为System.Double
,反之亦然。)