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

