当试图反序列化json时,不能在JsonConvert之后实现迭代器设计模式

本文关键字:JsonConvert 之后 实现 设计模式 迭代器 不能 反序列化 json | 更新日期: 2023-09-27 18:16:37

我有以下对象,它与我从一个REST请求中获得的JSON对象的模式相匹配:

public class MyObject
    {
        public List<string> columns { get; set; }
        public List<List<string>> rows { get; set; }
        public DisplayValue displayValue { get; set; }
        public string currency { get; set; }
        public object alert { get; set; }
    }
    public class DisplayValue
    {
        public Id DisplayId { get; set; }
    }
    public class Id
    {
        public List<string> IdToName { get; set; }
    }

这个对象匹配到我得到的响应,下一个代码是使用MyObject的上层实现(我使用c#的RestSharp):

        var response = client.Execute(request);
        result = JsonConvert.DeserializeObject<MyObject>(response.Content);

现在我想在MyObject上实现迭代器设计模式。rows是我实际使用的唯一字段。

因此,我将MyObject类更改为以下
public class MyObject : IEnumerable<List<string>
    {
        public List<string> columns { get; set; }
        public List<List<string>> rows { get; set; }
        public DisplayValue displayValue { get; set; }
        public string currency { get; set; }
        public object alert { get; set; }
    }

        public IEnumerator<List<string>> GetEnumerator()
        {
            foreach (List<string> row in rows)
            {
                yield return row;
            }
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
    public class DisplayValue
    {
        public Id DisplayId { get; set; }
    }
    public class Id
    {
        public List<string> IdToName { get; set; }
    }

但是当我尝试JSONConvert时,我得到以下异常:

不能反序列化当前JSON对象(例如{"name":"value"})为类型"MyObject",因为该类型需要一个JSON数组(例如[1,2,3])来反序列化正确。要修复此错误,可以将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其为正常类型.NET类型(例如,不是像整数这样的原始类型,也不是集合)类型(如数组或列表),可以从JSON中反序列化对象。还可以将JsonObjectAttribute添加到类型中以强制使用它对JSON对象进行反序列化。

知道为什么会发生这种情况吗?

当试图反序列化json时,不能在JsonConvert之后实现迭代器设计模式

问题是Json。NET将尝试将任何为某些T实现IEnumerable<T>的POCO序列化为JSON 数组,而不是JSON 对象,如本文所述。由于您的JSON可能不是一个数组,因此您将收到您所看到的异常。

因为你不希望你的MyObject序列化为一个数组,你可以强制Json。. NET通过使用[JsonObject]:

标记它来(反)序列化它作为一个对象:
[JsonObject]
public class MyObject : IEnumerable<List<string>>
{
    public List<string> columns { get; set; }
    public List<List<string>> rows { get; set; }
    public DisplayValue displayValue { get; set; }
    public string currency { get; set; }
    public object alert { get; set; }
    // Implementation of IEnumerable<List<string>>...
}

参见JsonObjectAttribute强制对象序列化