如何在 JEnumerable<JToken> 对象中查看 Children().ToList() 方法?

Posted

技术标签:

【中文标题】如何在 JEnumerable<JToken> 对象中查看 Children().ToList() 方法?【英文标题】:How to see Children().ToList() method in JEnumerable<JToken> object? 【发布时间】:2012-02-08 14:23:04 【问题描述】:

我尝试通过 JSON.NET 解析 JSON 并且在 App 类中是可以的,但是如果我想在自定义类中编写解析方法,VS 在 JEnumerable&lt;JToken&gt; 对象中看不到方法 ToList()

上市:

JObject newsResponse = JObject.Parse(e.Result);
IList<JToken> results = newsResponse["NewsResponse"]["NewsItems"]["NewsItem"].Children().ToList(); //Here don't see ToList()
List<News> newsResults = new List<News>();

foreach (JToken result in results)

    News searchResult = JsonConvert.DeserializeObject<News>(result.ToString());
    newsResults.Add(searchResult);

错误:

'Newtonsoft.Json.Linq.JEnumerable' 确实 不包含“ToList”的定义,也没有扩展方法“ToList” 接受类型的第一个参数 'Newtonsoft.Json.Linq.JEnumerable' 可以 被发现(您是否缺少 using 指令或程序集引用?)

【问题讨论】:

为什么需要ToList()?也许您可以将IList&lt;JToken&gt; 替换为var 并删除ToList() 我会把它作为答案发布然后:) 【参考方案1】:

你不需要在这里使用ToList()

var results = newsResponse["NewsResponse"]["NewsItems"]["NewsItem"].Children(); 

这将生成一个可与下面的foreach 一起使用的可枚举(惰性)集合。

注意:我使用 var 是因为我不知道这里返回的确切类型,但我们并不真正关心它,而且它可能相当复杂,所以它真的很有用。

【讨论】:

【参考方案2】:

由于我无法对 jv42 的回答发表评论,而且我不喜欢匿名类型,所以我会在他的回答的基础上再做一点。

你应该不需要像上面提到的那样使用.ToList(),结果会变成一个JEnumerable,可以通过foreach'ed through:

JEnumerable results = newsResponse["NewsResponse"]["NewsItems"]["NewsItem"].Children();

foreach( JToken result in results )

    Console.WriteLine(result.ToString());

【讨论】:

var 与匿名类型有很大不同,它只是一个关键字告诉编译器为您填写类型,您仍然使用静态类型并且表达式的类型没有改变(没有转换或任何东西)。

以上是关于如何在 JEnumerable<JToken> 对象中查看 Children().ToList() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 字符串转换为 C# IEnumerable<JToken>

如何从 Newton.Json.Linq.JToken 转换为 byte[]?

Newtonsoft JToken 的列表框显示值

如何使用 JSON 路径获取 JSON 字符串的一部分而不是 JToken?

将 JSON 解析为 JToken 时如何将所有键更改为小写

JToken.WriteToAsync 不写入 JsonWriter