有没有办法将dynamic
对象转换为IEnumerable
类型以过滤具有属性的集合。
dynamic data = JsonConvert.DeserializeObject(response.Content);
我需要访问这样的东西
var a = data.Where(p => p.verified == true)
有任何想法吗?
只要data
是IEnumerable
某种类型的,您就可以使用:
var a = ((IEnumerable) data).Cast<dynamic>()
.Where(p => p.verified);
Cast<dynamic>()
is 以 a 结尾,因此IEnumerable<dynamic>
lambda 表达式的参数类型也是dynamic
。
尝试投射到IEnumerable<dynamic>
((IEnumerable<dynamic>)data).Where(d => d.Id == 1);
这种方法比其他方法快 4 倍。
祝你好运
如果可以,理想的解决方案是在反序列化时指定类型,以避免稍后强制转换。这比上面建议的方法要干净得多。
所以如果你有 -
dynamic data = JsonConvert.DeserializeObject(response.Content);
然后只需将其更改为 -
var data = JsonConvert.DeserializeObject<IEnumerable<dynamic>>(response.Content);
这可能会有所帮助,将 jsonString 替换为 response.Content 并根据您的响应内容在需要时使用嵌套循环。
在下面的代码中,JValue.Parse 将返回 IEnumerable 的 JToken
string jsonString = "[{\"Question\":{\"QuestionId\":49,\"QuestionText\":\"Whats your name?\",\"Answer\":\"xyz\"}},{\"Question\":{\"QuestionId\":51,\"QuestionText\":\"Are you smart?\",\"Answer\":\"Yes\"}}]";
dynamic myObject = JValue.Parse(jsonString);
foreach (dynamic questions in myObject)
{
Console.WriteLine(questions.Question.QuestionId + "." + questions.Question.QuestionText.ToString());
Console.WriteLine("Ans. " +questions.Question.Answer);
Console.WriteLine();
}
Console.Read();