2

これが私が試みている2つのクエリの例です(アプリでは出力データにJSONを使用しますが、これはフォーマットに役立ちます):

強制失敗:ジブリッシュ

試行中:スタックオーバーフロー

これを実行するとデータがプルバックされ、探している領域が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. ページのページIDを事前に知らなくても、正常にクエリされたアイテムにアクセスするにはどうすればよいですか?

4

1 に答える 1

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"];
}

しかし、個人的には、このような場合はJSONではなくXMLを使用することを好みます。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");
}
于 2012-09-24T12:41:37.940 に答える