我在 C# 中遇到与浮点数序列化相关的 System.Text.Json 问题。当序列化带有小数部分(例如 4.0)的浮点数时,该库似乎省略了小数部分,导致 JSON 表示形式仅为 4 而不是 4.0。
我尝试使用各种配置,包括设置 NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals 和 NumberHandling = JsonNumberHandling.WriteAsString,但行为保持不变。
有没有办法在序列化过程中保留完整的表示(例如 4.0),或者当前版本的 System.Text.Json 是否存在已知的限制?
感谢您的任何见解或建议。
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]"