2012-09-23 72 views
2

这里有两个例子查询我试图(在我的应用程序使用JSON的输出数据,而这有助于格式化):查询维基百科网页API

强制失败:Gibberish

尝试:Stack Overflow

运行这个确实会拉回数据,我知道我正在寻找的区域是在jObject [“query”] [“pages”]中。所以我注意到,失败时,页面名称/属性/无论是“-1”和查询有效的东西给你一个唯一的ID为该主题。

这是我目前拥有的代码:

JObject excerpt = JObject.Parse(reader.ReadToEnd()); 
if ((string) excerpt["query"]["pages"] == "-1") 
    return null; 
result.Excerpt = (string)excerpt["query"]["pages"]["extract"]; 

失败的,如果检查,我确信它最终会失败的摘录一个为好。

  1. 如何检查“页面”中的项目以查看它是否被称为“-1”?

  2. 如何在事先不知道页面的pageid的情况下进入成功查询的项目?

+1

你应该在遍历所有查询返回的页面;可能会有几个,如[本示例中的查询](http://en.wikipedia.org/w/api.php?action=query&prop=extracts&exintro=1&exlimit=max&titles=Wikipedia|Stack+Overflow|ghjgjhvm|jhmvjhmv&format=jsonfm )。 –

+1

顺便说一句,你可能不需要使用流,看看['WebClient.DownloadString()'](http://msdn.microsoft.com/en-us/library/system.net.webclient.downloadstring )。 – svick

回答

1

如果您在JSON.NET中有JSON字典,可以将其视为属性集合(JProperty)。你可以在该集合上使用LINQ方法Single()来获取它的唯一属性。我认为检查页面是否真的缺失的一种更好的方法是检查它的missing属性(或者,或者检查它是否有excerpt)。整个代码看起来像这样:

private static string GetExtract(string json) 
{ 
    var excerpt = JObject.Parse(json); 
    var pageProperty = (JProperty)excerpt["query"]["pages"].Single(); 

    var page = (JObject)pageProperty.Value; 

    if (page["missing"] != null) 
     return null; 

    return (string)page["extract"]; 
} 

但个人而言,我喜欢在这种情况下使用XML而不是JSON。在XML中,该方法反而会看起来像(它比JSON版本更长的时间,但它也是简单的,我认为这是一个加号):

private static string GetExtractXml(string xml) 
{ 
    var document = XDocument.Parse(xml); 

    var page = document 
     .Element("api") 
     .Element("query") 
     .Element("pages") 
     .Elements("page") 
     .Single(); 

    if (page.Attribute("missing") != null) 
     return null; 

    return (string)page.Element("extract"); 
}