咨询区
user1618825:
有没有一种方式可以将 dynamic
对象转成 可过滤的 IEnumerable
类型对象?比如下面的代码:
dynamic data = JsonConvert.DeserializeObject(response.Content);
然后用Linq去访问
var a = data.Where(p => p.verified == true)
回答区
Jon Skeet:
只要 data 是某一种 IEnumerable
类型,就可以像下面这样用。
var a = ((IEnumerable) data).Cast<dynamic>().Where(p => p.verified);
这里用 Cast<dynamic>()
的目的就是将 data 转成 IEnumerable<dynamic>
,好处在于 lambda 表达式
中的参数也是 动态类型。
user3407039:
如果可以的话,理想的方式是反序列化时指定好类型,这样就可以避免后期再 Cast
,比如下面的代码:
dynamic data = JsonConvert.DeserializeObject(response.Content);
可以改造成
var data = JsonConvert.DeserializeObject<IEnumerable<dynamic>>(response.Content);
Varun Nair:
这里我提供一些思路可能对你有帮助,用 jsonString
作为 response.Content
,必要的话再在 response 中做迭代过滤。
下面的代码通过 JValue.Parse
来返回 JToken,这里的 JToken 就是 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();
点评区
其实我觉得既然都用了 JsonConvert
,直接用它内置的 JObject,JToken
来动态解析 json 即可,就如 Varun Nair
所述,简单粗暴。