咨询区
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 所述,简单粗暴。