有没有办法将dynamic
对象转换为IEnumerable
类型以过滤带属性的集合。
dynamic data = JsonConvert.DeserializeObject(response.Content);
我需要访问类似这样的内容
var a = data.Where(p => p.verified == true)
任何想法?
答案 0 :(得分:98)
只要data
是某种IEnumerable
,您就可以使用:
var a = ((IEnumerable) data).Cast<dynamic>()
.Where(p => p.verified);
Cast<dynamic>()
最终会得到IEnumerable<dynamic>
,因此lambda表达式的参数类型也是dynamic
。
答案 1 :(得分:39)
尝试转换为IEnumerable<dynamic>
((IEnumerable<dynamic>)data).Where(d => d.Id == 1);
这种方法比其他方法快4倍。
祝你好运答案 2 :(得分:0)
如果可以的话,理想的解决方案是在反序列化时指定类型,以避免以后再进行转换。这比上面建议的方法干净得多。
所以,如果您有-
venv
然后只需将其更改为-
dynamic data = JsonConvert.DeserializeObject(response.Content);
答案 3 :(得分:0)
这可能会有所帮助,将 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();