【发布时间】:2021-05-24 07:24:33
【问题描述】:
我一直在努力使用 Utf8JsonWriter 编写诸如 82.0 之类的双精度。
默认情况下,WriteNumberValue 方法采用双精度并为我格式化,格式(这是标准的“G”格式)省略了“.0”后缀。我找不到控制它的方法。
按照设计,我似乎不能只将原始字符串写入 Utf8JsonWriter,但我找到了一种解决方法:创建一个 JsonElement 并调用 JsonElement.WriteTo`。这个calls 一个private method in Utf8JsonWriter 并将字符串直接写入其中。
有了这个发现,我觉得这是一个非常老套且效率低下的实现。
open System.Text.Json
void writeFloat(Utf8JsonWriter w, double d) {
String floatStr = f.ToString("0.0################")
JsonElement jse = JsonDocument.Parse(floatStr).RootElement
jse.WriteTo(w)
}
无论如何我都需要格式化一个双精度,但解析它,创建一个 jsonDocument 和一个 JsonElement,只是为了能够找到一种调用受保护方法的方法,似乎真的很浪费。但是,它确实有效(我用 F# 编写并翻译成 C#,如果我在语法中出现错误,请道歉)。
有没有更好的方法?想到的一些潜在解决方案(我是 dotnet 新手,所以我不确定这里有什么可能):
- 有没有办法直接访问private API?我认为子类化 Utf8Writer 可能有效,但它是一个密封类。
- 我可以直接实例化一个 JsonElement 而不需要整个解析过程吗?
至于为什么这是必要的:我需要强制写入带有.0 附加的整数值,因为我需要与之交互的非常具体的格式,它区分整数和浮点 JSON 值。 (我可以接受指数格式,因为这显然是一个浮点数)。
【问题讨论】:
-
必须尝试编写自定义转换器?但是,这个json的接收方在省略小数位时遇到了这么多麻烦,这似乎很奇怪
-
听起来像是一个 x-y 问题 - 为什么需要这种精度?如果它那么重要,为什么不将其作为字符串传输?
-
数据的消费者将82.0和82视为不同语义的不同值,此时无法更改。
-
如果你改用
Decimal是否有效?由于Decimal以不同方式存储 82.0 和 82。 -
别忘了处理掉
JsonDocument。
标签: c# .net system.text.json