Newtonsoft.Json序列化误识别[SQLite.Ignore]属性问题咨询
问题解答
Newtonsoft.Json 13.0.3默认会识别类名为IgnoreAttribute的第三方特性,包括SQLite的[SQLite.Ignore],这是它的设计行为,并非bug。
原因分析
Newtonsoft.Json的默认契约解析器DefaultContractResolver会扫描成员上的所有特性,只要特性类名是IgnoreAttribute(不管所属命名空间),就会将对应属性标记为序列化排除项。SQLite的[SQLite.Ignore]刚好满足这个命名规则,所以被自动排除序列化。
解决办法
有两种可行方案:
方案一:强制指定序列化(轻量)
给目标属性添加[JsonProperty]特性,显式告诉序列化器要包含该属性,优先级会覆盖[SQLite.Ignore]的排除逻辑:[SQLite.Ignore] [JsonProperty] public string Name { get; set; }方案二:自定义契约解析器(全局)
如果有大量带[SQLite.Ignore]的属性需要序列化,可以自定义契约解析器,移除SQLite忽略特性的影响:public class CustomContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = base.CreateProperty(member, memberSerialization); // 检查并取消SQLite.Ignore的排除标记 var sqliteIgnore = member.GetCustomAttributes(typeof(SQLite.IgnoreAttribute), true).FirstOrDefault(); if (sqliteIgnore != null) { property.Ignored = false; } return property; } }使用时在序列化配置中指定该解析器:
var jsonSettings = new JsonSerializerSettings { ContractResolver = new CustomContractResolver() }; string jsonString = JsonConvert.SerializeObject(yourInstance, jsonSettings);
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

