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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:12:25