【发布时间】:2022-01-22 06:48:36
【问题描述】:
考虑json字符串:
var json = "{\"myfield\":5e-0000006}";
我想反序列化该 json,并将字段“myfield”作为原始字符串获取。 示例:
JToken tok = <Deserialize> // how do this??
var val = tok["myfield"].ToString(); // need get "5e-0000006"
我需要获取原始字符串中的 EXACT 字符串值(例如“5e-0000006”,但它可能是任何有效的浮点字符串)。
【问题讨论】:
-
为什么?这不是一个字符串,它是一个数字。如果您解析该 JSON 字符串,则 JToken 将包含一个数字属性。如果您想以某种方式显示该数字,请指定使用 String.Format 或您的 UI 框架使用的任何内容。
Standard deserialization returns val = "0.000005"并非如此。代码tok["myfield"].ToString();对该数值调用ToString(),它使用您的语言环境的数字格式。如果您想要不同的格式,您可以使用格式字符串。例如String.Format("{0:G2}");或((double)tok["myfield"]).ToString("G2"); -
你的问题不正确。你必须解释你需要多少个零。 5E-06 适合你吗?如果不是,为什么?
-
我需要获取原始字符串中的确切字符串值(例如“5e-0000006”,但它可能是任何正确的浮点字符串)。
-
你不能。
JsonTextReader将 JSON 浮点数解析为double或decimal并丢弃 JSON 字符序列。请参阅this comment from JamesNK:正确的行为是在解析时不将值转换为任何值,并将其保留为char[],直到请求 .NET 类型。但这是一个需要在 2007 年做出的设计决策。现在改变它为时已晚。 -
您可能会考虑切换到 System.Text.Json,其
Utf8JsonReader确实保留了字符序列。另请参阅Json.Net not serializing decimals the same way twice。