C#类实现IEnumerable接口后JsonConvert反序列化失败是什么原因?
问题原因
Newtonsoft.Json(Json.NET)内置的类型识别规则默认会将所有实现了IEnumerable/IEnumerable<T>接口的类型判定为集合类型,集合类型对应的合法JSON输入是数组格式(比如[1,2,3])。
你的OverallData类原本是普通POCO类,Json.NET会按普通对象逻辑解析输入的JSON对象({"key":"value"}格式),匹配类的属性完成反序列化;当你实现IEnumerable<IllinoisTestingResults>之后,Json.NET就会将它识别为集合,要求输入JSON必须是数组格式,和你实际传入的JSON对象结构不匹配,因此抛出错误。
解决方案
直接按报错提示的最优方案处理即可:给OverallData类添加[JsonObject]特性,强制告诉Json.NET该类型需按普通对象规则反序列化,不受实现了集合接口的影响。
修改后的类定义示例:
[JsonObject] // 新增这行特性即可 public class OverallData : IEnumerable<IllinoisTestingResults> { [JsonProperty("lastUpdatedDate")] private LastUpdatedDate LastUpdatedDate { get; set; } public DateTime UpdatedDate => LastUpdatedDate.DateTime; [JsonProperty("state_testing_results")] public List<IllinoisTestingResults> StateTestingResults { get; set; } = new (); #region Implementation of IEnumerable public IEnumerator<IllinoisTestingResults> GetEnumerator() { foreach (IllinoisTestingResults result in StateTestingResults) { yield return result; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } #endregion public IllinoisTestingResults this[int index] => StateTestingResults[index]; public IllinoisTestingResults this[DateTime date] { get { foreach (IllinoisTestingResults result in StateTestingResults) { if (result.TestDate == date) { return result; } } return null; } } }
内容的提问来源于stack exchange,提问作者lwashington27
相关产品推荐
相关产品推荐

