C# 中浮点数的 System.Text.Json 序列化问题

问题描述 投票:0回答:1

我在 C# 中遇到与浮点数序列化相关的 System.Text.Json 问题。当序列化带有小数部分(例如 4.0)的浮点数时,该库似乎省略了小数部分,导致 JSON 表示形式仅为 4 而不是 4.0。

我尝试使用各种配置,包括设置 NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals 和 NumberHandling = JsonNumberHandling.WriteAsString,但行为保持不变。

有没有办法在序列化过程中保留完整的表示(例如 4.0),或者当前版本的 System.Text.Json 是否存在已知的限制?

感谢您的任何见解或建议。

c# json serialization floating-point system.text.json
1个回答
0
投票

JSON 不区分

float
int
,它只有 Number 的概念,因此一般情况下您应该避免依赖特定的数字格式。

如果目前您无法修复使用 JSON 的应用程序,您可以使用 自定义转换器。例如:

class FloatConverter : JsonConverter<float>
{
    public override float Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
        throw new NotImplementedException();

    public override void Write(Utf8JsonWriter writer, float value, JsonSerializerOptions options)
    {
        // at least one decimal place, add reasonable amount of places with #
        writer.WriteRawValue(value.ToString("0.0########", CultureInfo.InvariantCulture));
    }
}

及用法:

var serialize = JsonSerializer.Serialize(new float[] { 1, 1.1f, 4.5555f }, new JsonSerializerOptions
{
    Converters = { new FloatConverter() }
});
Console.WriteLine(serialize); // prints "[1.0,1.1,4.5555]"
© www.soinside.com 2019 - 2024. All rights reserved.