71

有没有办法将dynamic对象转换为IEnumerable类型以过滤具有属性的集合。

dynamic data = JsonConvert.DeserializeObject(response.Content);

我需要访问这样的东西

var a = data.Where(p => p.verified == true)

有任何想法吗?

4

4 回答 4

124

只要dataIEnumerable某种类型的,您就可以使用:

var a = ((IEnumerable) data).Cast<dynamic>()
                            .Where(p => p.verified);

Cast<dynamic>()is 以 a 结尾,因此IEnumerable<dynamic>lambda 表达式的参数类型也是dynamic

于 2013-09-11T07:22:35.363 回答
53

尝试投射到IEnumerable<dynamic>

((IEnumerable<dynamic>)data).Where(d => d.Id == 1);

这种方法比其他方法快 4 倍。

祝你好运

于 2013-09-11T07:22:03.170 回答
0

如果可以,理想的解决方案是在反序列化时指定类型,以避免稍后强制转换。这比上面建议的方法要干净得多。

所以如果你有 -

dynamic data = JsonConvert.DeserializeObject(response.Content);

然后只需将其更改为 -

var data = JsonConvert.DeserializeObject<IEnumerable<dynamic>>(response.Content);
于 2020-04-12T16:58:53.927 回答
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();
于 2021-01-19T18:18:31.110 回答