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

  

http://en.wikipedia .ORG / W / api.php动作=查询&安培; rvprop =含量&安培;丙=修订&安培;格式= JSON&安培;标题=苹果

我可以像这样获得一个JSON字符串

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

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

jsonObject.query.pages.18978754

我需要澄清一些假设,我不知道号码18978754.我是否需要先获得号码,否则我仍然可以获得“某物......”。知道数字。

有帮助吗?

解决方案

使用数组语法怎么样:

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]['*']);
        }
    }
}

在firebug中使用此代码,我现在得到你正在寻找的一般情绪:

Something.....

结果

当然,您可以使用:

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

如果你总是只想处理 revisions 数组的第一个元素,哪个会正常工作。

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

其他提示

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

当您将&amp; indexpageids 添加到您的请求时,您将获得 pageids 。更多信息此处

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

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

$final_result = $new_result["pageid"];

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top