Использование Wiki API по формату JSON не может получить контент - PullRequest
3 голосов
/ 01 августа 2009

Я использую этот код для сбора информации из вики:

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 возвращает меня как String 18978754, но может t получить значение следующим образом:

jsonObject.query.pages.18978754

Некоторые предположения, которые мне нужно уточнить, я не знаю номер 18978754. Нужно ли мне сначала получить номер, или я все еще могу получить "Нечто ..." в пределах знания номера.

Ответы [ 3 ]

5 голосов
/ 01 августа 2009

А как насчет использования синтаксиса массива:

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 : -)


Добавлено после просмотра комментария / редактирования

Если вы не знаете идентификаторы страниц, вы можете выполнить итерацию по страницам примерно так:

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

Обратите внимание, что я использую hasOwnProperty, чтобы убедиться, что объект, на котором я работаю, обладает свойством, и что он не исходит от какого-либо вида наследования или чего-то подобного:

Каждый объект произошел от Объекта наследует метод hasOwnProperty. Этот метод может быть использован для определения есть ли у объекта указанный собственность как прямая собственность этого объект; в отличие от оператора в этом метод не проверяет цепь прототипа объекта.

В зависимости от того, что в "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.


Просто будьте осторожны: в вашем примере была только одна ревизия; код, который я предоставил, должен быть в состоянии справиться со многими; до вас, чтобы определить, что вы хотите с ними делать; -)

3 голосов
/ 02 марта 2012

Поздно, но может быть полезно для кого-то еще.

Когда вы добавите &indexpageids к вашему запросу, вы получите pageids. Больше информации здесь .

1 голос
/ 17 марта 2011

У меня была такая же проблема при создании парсера на основе php для Wiki API - вот как я решил ее.

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

$final_result = $new_result["pageid"];

Примечание: я знаю, что это вопрос PHP в вопросе JS, но не смог найти точно такой же вопрос / проблему на этом форуме - я уверен, что это будет кому-то полезно

...