2012-09-23 122 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"); 
}