如何通过Newtonsoft.Json将BankAccount的DoubleAmount序列化为格式化字符串?
解决BankAccount金额序列化格式化问题的几种方案
我明白你想要的效果:计算得到的double类型金额值,在序列化为JSON返回前端时,自动转换成类似100k这样的简写格式,而不是显示原始数字。下面给你几个实用的实现思路:
方案一:自定义JSON转换器(推荐)
这种方式最灵活,能统一处理所有需要格式化的金额属性,还不会污染实体类的业务逻辑。
步骤1:实现自定义JsonConverter
using System; using Newtonsoft.Json; public class AmountFormatConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(double); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var amount = (double)value; // 可根据需求调整格式化规则,比如仅对≥1000的数值做转换,否则保留原数 if (amount >= 1000) { var formatted = $"{Math.Round(amount / 1000)}k"; writer.WriteValue(formatted); } else { writer.WriteValue(amount.ToString()); } } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 如果需要处理前端传入的格式化字符串(比如"100k")转成double,可在这里实现逻辑 var value = reader.Value.ToString(); if (value.EndsWith("k", StringComparison.OrdinalIgnoreCase)) { if (double.TryParse(value.Replace("k", ""), out var num)) { return num * 1000; } } return double.TryParse(value, out var result) ? result : 0; } }
步骤2:在实体类中应用转换器
修改你的BankAccount类,给目标属性加上转换器特性即可:
public class BankAccount { // 标记该属性使用自定义转换器序列化 [JsonConverter(typeof(AmountFormatConverter))] public double DoubleAmount { get; set; } // 若原有的Amount属性不再需要,可直接删除;如需保留做其他用途也可以继续留存 // public string Amount { get; set; } }
这样当你序列化BankAccount对象时,DoubleAmount = 100000会自动被序列化为"DoubleAmount": "100k"。
方案二:使用计算属性
如果你的序列化框架支持,也可以用只读计算属性暴露格式化后的金额,同时保留原始DoubleAmount用于业务计算:
public class BankAccount { // 该属性用于业务计算,标记为不参与序列化 [JsonIgnore] public double DoubleAmount { get; set; } // 该属性用于序列化,返回格式化后的字符串 public string Amount { get { if (DoubleAmount >= 1000) { return $"{Math.Round(DoubleAmount / 1000)}k"; } return DoubleAmount.ToString(); } // 如需反序列化前端传入的格式化字符串,可在这里补充赋值逻辑 set { if (value.EndsWith("k", StringComparison.OrdinalIgnoreCase)) { if (double.TryParse(value.Replace("k", ""), out var num)) { DoubleAmount = num * 1000; } } else { double.TryParse(value, out DoubleAmount); } } } }
这种方式的优势是逻辑直接写在实体类里,无需额外的转换器类,但如果多个类都需要类似格式化,会出现代码重复的问题。
额外提示
- 格式化规则可按需调整,比如保留小数(如
125500转成125.5k),或者支持更大的单位(如M、B); - 如果你用的是
System.Text.Json而非Newtonsoft.Json,自定义转换器的写法会略有不同,需要继承JsonConverter<double>; - 反序列化逻辑要匹配前端可能传入的格式,确保能正确转换回
double类型数值。
内容的提问来源于stack exchange,提问作者João Menighin
相关产品推荐
相关产品推荐

