Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过JSON格式使用Wiki API可以';我看不到内容_Javascript_Json_Api_Mediawiki - Fatal编程技术网

Javascript 通过JSON格式使用Wiki API可以';我看不到内容

Javascript 通过JSON格式使用Wiki API可以';我看不到内容,javascript,json,api,mediawiki,Javascript,Json,Api,Mediawiki,我使用以下代码从Wiki收集信息: 我可以得到这样的JSON字符串 { "query": { "normalized": [{ "from": "apple", "to": "Apple" }], "pages": { "18978754": { "pageid": 18978754, "ns": 0,

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

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

{
    "query": {
        "normalized": [{
            "from": "apple",
            "to": "Apple"
        }],
        "pages": {
            "18978754": {
                "pageid": 18978754,
                "ns": 0,
                "title": "Apple",
                "revisions": [{
                    "*": "Something....."
                }]
            }
        }
    }
}
我可以将其评估为JSON,但问题是,我可以进入query>pages,之后我无法深入,这是因为Wiki API以字符串18978754的形式返回我,但它无法通过以下方式获取值:

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"
这是非常有效的JS语法:-)


在发表评论/编辑后添加

如果您不知道页面的ID,您可以使用如下方法在页面上进行迭代:

for (var pageId in data.query.pages) {
    if (data.query.pages.hasOwnProperty(pageId)) {
        console.log(data.query.pages[pageId].title);
    }
}
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]);
}
请注意,我使用它来确保我所在的对象具有属性,并且它不是来自任何类型的继承或类似的东西:

每个物体都是物体的后代 继承hasOwnProperty方法。 此方法可用于确定 对象是否具有指定的 财产作为其直接财产 对象与in运算符不同,此 方法不检查 对象的原型链

根据“
修订版”
”中的内容,您可能也必须对该版本执行相同的操作,顺便说一句


希望这有助于更好地:-)



第二次编辑,在第二组注释之后:

嗯,再往前走一点(我不认为你是认真的):

是一个数组(请注意
[]
符号),似乎可以包含多个对象。
因此,您可以通过这种方式获得其中的第一个:

data.query.pages[pageId].revisions[0]
data.query.pages[pageId].revisions[1]
第二个是这样的:

data.query.pages[pageId].revisions[0]
data.query.pages[pageId].revisions[1]
(您提供的示例中没有第二个示例,顺便说一句——因此这是理论上的^^)

等等


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

for (var pageId in data.query.pages) {
    if (data.query.pages.hasOwnProperty(pageId)) {
        console.log(data.query.pages[pageId].title);
    }
}
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]);
}

因此,最终代码变成:

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

当然,您可能只需要使用:

for (var pageId in data.query.pages) {
    if (data.query.pages.hasOwnProperty(pageId)) {
        console.log(data.query.pages[pageId].revisions[0]['*']);
    }
}
如果您总是希望只处理
revisions
数组的第一个元素,那么这将很好地工作



注意:在你的例子中,只有一个修订;我提供的代码应该能够处理许多问题;由您决定如何处理这些;-)

我在为Wiki API创建基于php的解析器时也遇到了同样的问题——下面是我解决这个问题的方法

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

$final_result = $new_result["pageid"];

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

晚了,但可能对其他人有帮助


&indexpageids
添加到请求时,您将获得
页面ID
。更多信息。

我可以直接获得“某物…”吗?还有一件事,假设我不知道“18978754”。。。。因为这个数字取决于wikiHi的不同主题,所以我编辑了我的答案,以展示一个在你不知道页面ID的情况下迭代页面的示例;希望这有帮助:-)我能回答这个问题吗?如何获得“某物…”值?(假设我不知道“某物…”data.query.pages[pageId].revisions.*和data.query.pages[pageId].revisions[*]都不起作用我已经第二次编辑了我的答案,以提供一个完整的示例(我想你会自己找到答案,这就是为什么我第一次没有进一步讨论的原因);希望这有帮助:-)请不要使用通用术语
Wiki
来专门指代Wikipedia或它使用的MediaWiki软件。刚刚发现这一点,它是实验性的,但它重新排列了json,因此它不会以数字开头---
&formatversion=2
这确实简化了问题!它使浏览JSON对象变得更加容易。