查询Wikipedia Web API

时间:2012-09-23 18:34:12

标签: .net json json.net wikipedia-api

以下是我正在尝试的两个示例查询(在应用程序中我使用JSON作为输出数据,但这有助于格式化):

强制失败: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"];

它在if检查上失败了,我很确定它最终也会在摘录中失败。

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

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

1 个答案:

答案 0 :(得分: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");
}