当试图反序列化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。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强制对象序列化