模型类属性标记IgnoreDataMember特性后,如何通过JsonConvert.SerializeObject使其参与序列化
嘿,这个场景我太熟悉了!虽然IgnoreDataMember特性会告诉大多数序列化器忽略对应属性,但Newtonsoft.Json(也就是大家常说的Json.NET)其实给咱们留了几种解决办法,能让这个属性在序列化结果里现身:
方法1:用JsonProperty特性强制标记(最简单)
Json.NET自己的[JsonProperty]特性优先级比[IgnoreDataMember]更高——只要给目标属性加上这个特性,不管有没有IgnoreDataMember,Json.NET都会把它包含在序列化结果里。
代码示例:
using System.Runtime.Serialization; using Newtonsoft.Json; public class MyModel { // 同时标记两个特性,Json.NET会优先遵循JsonProperty的规则 [IgnoreDataMember] [JsonProperty] public string MyIgnoredProperty { get; set; } public string NormalProperty { get; set; } } // 序列化时直接用默认方法即可 var model = new MyModel { MyIgnoredProperty = "我要出现在JSON里!", NormalProperty = "我是正常属性" }; string json = JsonConvert.SerializeObject(model);
方法2:自定义契约解析器(适合批量处理)
如果你有一大堆带IgnoreDataMember的属性需要序列化,不想一个个加特性,可以自定义一个契约解析器,让Json.NET忽略IgnoreDataMember的限制。
代码示例:
using System.Linq; using System.Runtime.Serialization; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; public class IgnoreDataMemberOverrideResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(System.Reflection.MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = base.CreateProperty(member, memberSerialization); // 检查属性是否带有IgnoreDataMember特性,有的话强制开启序列化 var ignoreAttr = member.GetCustomAttributes(typeof(IgnoreDataMemberAttribute), true).FirstOrDefault(); if (ignoreAttr != null) { property.Ignored = false; property.ShouldSerialize = _ => true; } return property; } } // 使用时传入自定义解析器 var serializerSettings = new JsonSerializerSettings { ContractResolver = new IgnoreDataMemberOverrideResolver() }; var model = new MyModel { MyIgnoredProperty = "批量处理后的我", NormalProperty = "正常属性" }; string json = JsonConvert.SerializeObject(model, serializerSettings);
方法3:手动构建匿名对象(临时应急)
如果只是个别场景需要序列化这个属性,不想修改原模型或配置,还可以手动创建匿名对象,把需要的属性都包含进去——这种方式最灵活,适合临时需求。
代码示例:
var model = new MyModel { MyIgnoredProperty = "临时现身的我", NormalProperty = "正常属性" }; // 手动组装要序列化的属性 var serializedObj = new { MyIgnoredProperty = model.MyIgnoredProperty, model.NormalProperty }; string json = JsonConvert.SerializeObject(serializedObj);
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

