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

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

是否有一种方法可以保留完整的表示(例如,4.0),或者当前版本的System.Text.json是否存在已知的限制?

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

推荐答案

JSON不区分floatint,它只有Number的概念,所以一般来说,你应该避免依赖于特定的数字格式.

如果你目前不能修复使用JSON的应用程序,你可以使用custom converter,它将使用特定的number format.例如:

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]"

Csharp相关问答推荐

List T.AddRange在传递ConcurrentDictionary作为参数时引发ArgumentExcellent

react 式扩展连接中的非交叉LeftDurationTimeout

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

将XPS转换为PDF C#

只有第一个LINQ.Count()语句有效

使用C#HttpClient以多部分形式数据发送带有非ASCII文件名的文件的问题

为具有实体框架后端的Reaction项目 Select 正确的Visual Studio模板

UWP应用程序try 将打包的本机.exe文件加载为C#程序集

显示文档的ECDsa签名PDF在Adobe Reader中签名后已被更改或损坏

TagHelpers在新区域不起作用

BFF到具有AAD/Entra ID B2C的内部API(.NET/ASP.NET核心/标识.Web)

如何使用Npgsql从SELECT获得所有查询结果

这是否比决定是否使用ConfigureAWait(False)更好?

多个选项卡上的MudForm验证

为什么我的属性即使没有显式地设置任何[必需]属性,也会显示验证?

如何在Cake脚本中设置MSBuild.exe的绝对路径

ASP.NET Core 8 Web API:如何添加版本控制?

游戏对象走向不同的方向

CsvHelper在第二次迭代时抛出System.ObjectDisposedException

C#如何替换两个XML元素值?