You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用System.Text.Json将float序列化为固定2位小数的JSON?

解决System.Text.Json序列化float为固定2位小数数字的问题

要实现将float序列化为JSON数字类型且保留固定2位小数(如12.30),需要编写自定义JsonConverter——因为默认序列化选项没有提供精度控制。核心是在写入JSON时强制格式化数值为两位小数的数字格式,而非字符串类型。

自定义转换器实现

创建针对float类型的转换器,通过格式化数值字符串并以原始值写入的方式,确保JSON输出为两位小数的数字:

using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;

public class FloatTwoDecimalConverter : JsonConverter<float>
{
    // 反序列化逻辑(按需实现)
    public override float Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType != JsonTokenType.Number)
            throw new JsonException("输入JSON节点不是数字类型");
        
        return reader.GetSingle();
    }

    // 序列化核心逻辑
    public override void Write(Utf8JsonWriter writer, float value, JsonSerializerOptions options)
    {
        // 四舍五入到两位小数
        var roundedValue = Math.Round(value, 2);
        // 格式化为固定两位小数的字符串,使用不变文化避免区域差异
        var formattedNumber = roundedValue.ToString("0.00", CultureInfo.InvariantCulture);
        // 以原始值写入,确保输出为JSON数字而非字符串
        writer.WriteRawValue(formattedNumber);
    }
}

使用转换器

在序列化时将自定义转换器添加到JsonSerializerOptions中:

var serializeOptions = new JsonSerializerOptions
{
    Converters = { new FloatTwoDecimalConverter() },
    // 可选:是否格式化JSON缩进
    WriteIndented = false
};

var sampleData = new { Amount = 12.3f };
var jsonString = JsonSerializer.Serialize(sampleData, serializeOptions);
// 输出结果:{"Amount":12.30}

关键说明

  • 为什么用WriteRawValue:默认的WriteNumberValue会根据数值的实际存储输出(如12.3f会输出12.3),而WriteRawValue允许直接写入格式化后的数字字符串,既保证是JSON数字类型,又强制保留两位小数。
  • 区域处理:使用CultureInfo.InvariantCulture避免因系统区域设置导致小数点变为逗号的问题。
  • 扩展适配:如果需要处理double或decimal类型,只需修改转换器的泛型参数(如JsonConverter<double>),核心逻辑保持一致。

内容的提问来源于stack exchange,提问作者Tuomas Hietanen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 08:05:22