Reputation:
Is there a way to convert dynamic
object to IEnumerable
Type to filter collection with property.
dynamic data = JsonConvert.DeserializeObject(response.Content);
I need to access something like this
var a = data.Where(p => p.verified == true)
Any Ideas?
Upvotes: 80
Views: 53380
Reputation: 484
This might help, replace jsonString with response.Content and use nested loops if required based on your response content.
In the below code JValue.Parse will return JToken which is IEnumerable
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();
Upvotes: 0
Reputation: 1335
If you are able to, the ideal solution is to specify the type when deserializing, so to avoid having to cast later. This is a lot cleaner than the approaches suggested above.
So if you have -
dynamic data = JsonConvert.DeserializeObject(response.Content);
Then simply change this to -
var data = JsonConvert.DeserializeObject<IEnumerable<dynamic>>(response.Content);
Upvotes: 0
Reputation: 3307
Try casting to IEnumerable<dynamic>
((IEnumerable<dynamic>)data).Where(d => d.Id == 1);
This approach is 4x faster than other approachs.
good luck
Upvotes: 58
Reputation: 1500035
So long as data
is an IEnumerable
of some kind, you can use:
var a = ((IEnumerable) data).Cast<dynamic>()
.Where(p => p.verified);
The Cast<dynamic>()
is to end up with an IEnumerable<dynamic>
so that the type of the parameter to the lambda expression is also dynamic
.
Upvotes: 130