3

我使用此代码从 Wiki 收集信息:

http://en.wikipedia.org/w/api.php?action=query&rvprop=content&prop=revisions&format=json&titles=apple

我可以得到这样的 JSON 字符串

{
    "query": {
        "normalized": [{
            "from": "apple",
            "to": "Apple"
        }],
        "pages": {
            "18978754": {
                "pageid": 18978754,
                "ns": 0,
                "title": "Apple",
                "revisions": [{
                    "*": "Something....."
                }]
            }
        }
    }
}

我可以将它评估为 JSON,但问题是,我可以进入查询>页面,之后我无法更深入,这是因为 Wiki API 将我作为字符串 18978754 返回,但它无法获取值:

jsonObject.query.pages.18978754

我需要澄清一些假设,我不知道号码 18978754。我是否需要先得到号码,或者我仍然可以在知道号码的情况下得到“某事......”。

4

3 回答 3

5

使用数组语法怎么样:

jsonObject.query.pages[18978754]

似乎正在工作,使用 firebug :

>>> data.query.pages[18978754]
Object pageid=18978754 ns=0 title=Apple revisions=[1]

和 :

>>> data.query.pages[18978754].title
"Apple"

请注意,其他属性也可以使用数组语法访问数据对象;例如 :

>>> data['query'].pages[18978754].title
"Apple"

这是完全有效的 JS 语法:-)


看到评论/编辑后添加

如果您不知道页面的 id,您可以遍历页面,如下所示:

for (var pageId in data.query.pages) {
    if (data.query.pages.hasOwnProperty(pageId)) {
        console.log(data.query.pages[pageId].title);
    }
}

请注意,我hasOwnProperty用来确保我所在的对象具有该属性,并且它不是来自任何类型的继承或类似的东西:

从 Object 继承的每个对象都继承了 hasOwnProperty 方法。该方法可用于判断一个对象是否具有指定属性作为该对象的直接属性;与 in 运算符不同,此方法不检查对象的原型链。

根据“ revision”中的内容,您可能也必须对那个做同样的事情,顺便说一句......


希望这有助于更好:-)



第二次编辑,在第二组评论之后:

好吧,走得更远(不认为你的意思是字面意思):

data.query.pages[pageId].revisions

[]是一个似乎能够包含多个对象 的数组(注意符号)。
所以,你可以通过这种方式获得第一个:

data.query.pages[pageId].revisions[0]

第二个这样:

data.query.pages[pageId].revisions[1]

(顺便说一句,您提供的示例中没有第二个 - 所以这是理论上的^^)

等等。


要获取所有这些对象,您必须执行某种循环,如下所示:

var num_revisions = data.query.pages[pageId].revisions.length;
var i;
for (i=0 ; i<num_revisions ; i++) {
    console.log(data.query.pages[pageId].revisions[i]);
}

现在,在该循环中,您应该能够获得给定对象的 '*' 属性:

data.query.pages[pageId].revisions[i]['*']


因此,最终代码变为:

for (var pageId in data.query.pages) {
    if (data.query.pages.hasOwnProperty(pageId)) {
        var num_revisions = data.query.pages[pageId].revisions.length;
        var i;
        for (i=0 ; i<num_revisions ; i++) {
            console.log(data.query.pages[pageId].revisions[i]['*']);
        }
    }
}

在萤火虫中使用这段代码,我现在得到了你正在寻找的文字刺痛:

Something.....


当然,您可能只使用:

for (var pageId in data.query.pages) {
    if (data.query.pages.hasOwnProperty(pageId)) {
        console.log(data.query.pages[pageId].revisions[0]['*']);
    }
}

如果您总是只想处理revisions数组的第一个元素,这会很好。


请注意:在您的示例中,只有一个修订版;我提供的代码应该可以处理很多;由你决定你想用这些做什么;-)

于 2009-08-01T14:34:59.493 回答
3

迟到但可能对其他人有帮助。

当您添加&indexpageids到您的请求时,您将获得pageids. 更多信息在这里

于 2012-03-02T09:33:38.483 回答
1

在为 Wiki API 创建基于 php 的解析器时,我遇到了同样的问题——这就是我解决它的方法。

$new_result = array_pop($result["query"]["pages"]);

$final_result = $new_result["pageid"];

注意:我知道这是 JS 问题中的 PHP 代码,但在该论坛中找不到完全相同的问题/问题 - 我相信这对某人有用。

于 2011-03-17T08:41:06.317 回答