您的问题是,当反序列化非只读的集合时,Json.NET会检查该集合是否已被分配,例如在包含类型的构造函数中。如果是这样,它将为反序列化的JSON内容填充先前存在的集合,而永不回退该集合。不幸的是,您的属性返回了一个临时代理集合,因此您的容器类
SpecialObject永远不会收到反序列化的结果。
防止这种情况的最简单方法是,通过JsonPropertyAttribute
设置,指定Json.NET应该始终分配一个新集合并将其重新设置,而不是重用先前存在的集合。[`ObjectCreationHandling
ObjectCreationHandling.Replace`](https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_ObjectCreationHandling.htm)
[JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)]public List<string> SpecialObjectIDs { get { return SpecialObjectCollection.Select(x => x.ID).ToList(); } set { tempObjectIDs = value; } }或者,您可以对代理集合属性使用
string []而不是
List<string>:
public string [] SpecialObjectIDs { get { return SpecialObjectCollection.Select(x => x.ID).ToArray(); } set { tempObjectIDs = value == null ? null : value.ToList(); } }由于无法调整数组大小,因此Json.NET将始终在反序列化时分配一个新数组,并在完成后将其重新设置。



