使用Newtonsoft.Json反序列化时,如何忽略类中的特定接口类型属性
我懂你遇到的这个问题!之前我也碰到过类似的情况——Newtonsoft.Json默认会处理类里的所有公共成员,结果碰到接口类型的集合就直接报错,因为它没法实例化接口。刚好你的需求很明确:既要保留ItemContents这个列表在反序列化后的对象里(已经初始化好的空列表),又不能让反序列化过程去碰它。
最直接也最省心的办法就是给你的ItemContents字段加上[JsonIgnore]特性。这个特性会告诉Newtonsoft.Json在序列化和反序列化过程中完全忽略这个成员,不会对它做任何操作。
修改你的Item类,加上特性之后是这样的:
public class Item { public string name { get; set; } public int id { get; set; } // 这个列表会正常参与反序列化 public List<Content> content { get; set; } // 加上JsonIgnore,让Newtonsoft忽略这个字段 [JsonIgnore] public List<IContent> ItemContents = new List<IContent>(); }
这样做之后,反序列化的时候,Newtonsoft会老老实实地处理content列表,完全不会碰ItemContents。而因为你已经在类里初始化了ItemContents = new List<IContent>(),所以当Item对象被创建出来的时候,这个列表就是一个空的、可用的集合,之后你可以根据自己的逻辑去填充它——比如把content里的Content对象转换成IContent类型再添加进去,完全不影响。
如果你的ItemContents是属性而不是字段(比如public List<IContent> ItemContents { get; set; } = new List<IContent>();),这个特性同样适用,直接加在属性上面就行。
这个方案完全满足你的需求:ItemContents会作为Item的一部分存在,反序列化过程不会对它造成干扰,也不会再出现那个“接口无法实例化”的错误。之后如果需求变化,需要让这个字段参与序列化/反序列化,只需要去掉[JsonIgnore]特性就行,非常灵活。
内容来源于stack exchange

