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

如何用JavaScriptSerializer忽略值为0的Decimal?Decimal值为0时能否隐藏元素?

刚好之前处理过类似的序列化需求,给你几个实用的方案来解决问题:

方案1:自定义JavaScriptConverter精准控制序列化逻辑

JavaScriptSerializer本身没有内置忽略特定值属性的功能,但我们可以通过自定义转换器来实现。这个方法的好处是完全可控,想忽略哪个属性、什么条件下忽略都能自己定义。

首先创建一个继承自JavaScriptConverter的转换器类:

public class MyDataConverter : JavaScriptConverter
{
    // 指定这个转换器支持的类型
    public override IEnumerable<Type> SupportedTypes
    {
        get { return new List<Type> { typeof(MyData) }; }
    }

    // 核心序列化逻辑:只添加非0的属性
    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        var myData = obj as MyData;
        if (myData == null) return new Dictionary<string, object>();

        var serializedProps = new Dictionary<string, object>();
        
        // 先添加Val1和Val2(如果你也想按需隐藏这两个,逻辑同理)
        serializedProps.Add("Val1", myData.Val1);
        serializedProps.Add("Val2", myData.Val2);

        // 只有当Val3不等于Decimal默认值0时,才加入序列化结果
        if (myData.Val3 != Decimal.Zero)
        {
            serializedProps.Add("Val3", myData.Val3);
        }

        return serializedProps;
    }

    // 反序列化逻辑(如果不需要反序列化,也可以简单实现或抛出异常)
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        var myData = new MyData();
        if (dictionary.ContainsKey("Val1")) myData.Val1 = Convert.ToDecimal(dictionary["Val1"]);
        if (dictionary.ContainsKey("Val2")) myData.Val2 = Convert.ToDecimal(dictionary["Val2"]);
        if (dictionary.ContainsKey("Val3")) myData.Val3 = Convert.ToDecimal(dictionary["Val3"]);
        return myData;
    }
}

然后在序列化的时候,记得把这个转换器注册到JavaScriptSerializer中:

// 注意:要序列化的是MyData的实例,不是类本身哦
var myDataInstance = new MyData { Val1 = 10, Val2 = 20, Val3 = 0 };

var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new List<JavaScriptConverter> { new MyDataConverter() });
var result = serializer.Serialize(myDataInstance);

这样得到的结果里就不会包含值为0的Val3了。

方案2:换用Newtonsoft.Json(更便捷的替代方案)

如果项目允许更换序列化库,Newtonsoft.Json(也就是Json.NET)提供了更简洁的方式来实现需求,只需要给属性加个特性标记:

public class MyData
{
    public decimal Val1 { get; set; }
    public decimal Val2 { get; set; }
    // 当属性值为默认值(Decimal的0)时,序列化时忽略该属性
    [JsonProperty(Condition = JsonPropertyCondition.WhenWritingDefault)]
    public decimal Val3 { get; set; }
}

序列化的时候直接用JsonConvert.SerializeObject(myDataInstance)就可以自动忽略值为0的Val3了。

关于你的第二个问题:Decimal值为0时能否隐藏对应元素?

当然可以!上面的两个方案都能实现这个效果。核心思路就是在序列化过程中,判断属性值是否为Decimal.Zero,如果是就不把这个属性加入到最终的序列化结果里。

另外提个小细节:你原来的代码里Serialize(MyData)是错误的,Serialize方法需要传入MyData的对象实例,而不是类类型,这点要注意哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:47:40