如何使用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
相关产品推荐
相关产品推荐

