You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:27:04