разобрать строку json из викимедиа с помощью jquery

Я пытаюсь получить информационный блок со страниц вики. Для этого я использую wiki API. Ниже приведен URL-адрес, с которого я получаю данные json.

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&titles="+first+"&rvsection=0

Где first — это переменная, содержащая название статьи для Википедии.

Я нахожу чрезвычайно сложным анализировать эти данные, чтобы сделать из них осмысленный html.

Сначала я использовал функцию $.each. Но цикл очень глубокий, и мне пришлось использовать его 6-7 раз, чтобы получить фактические данные, которые мне нужны. Я думаю, что есть лучшая альтернатива, чем эта. Пожалуйста помогите.

данные json для справки

jQuery16209061950308827726_1334683337112({"query":{"pages":{"11039790":{"pageid":11039790,"ns":0,"title":"Animal","revisions":[{"*":"{{Redirect|Animalia}}\n{{Other uses}}\n{{pp-semi-protected|small=yes}}\n{{pp-move-indef}}\n{{Taxobox\n| color = {{taxobox color|[[animalia]]}}\n| name = Animals\n| fossil_range = [[Ediacaran]] \u2013 Recent {{fossilrange|610|0|}}\n| image = Animal diversity.png\n| image_width = 250px\n| domain = [[Eukaryota]]\n{{Taxobox_norank_entry | taxon = [[Opisthokonta]]}}\n{{Taxobox_norank_entry | taxon = [[Holozoa]]}}\n{{Taxobox_norank_entry | taxon = [[Filozoa]]}}\n| regnum = '''Animalia'''\n| regnum_authority = [[Carolus Linnaeus|Linnaeus]], [[Systema Naturae|1758]]\n| subdivision_ranks = [[Phylum|Phyla]]\n| subdivision =\n* '''Subkingdom [[Parazoa]]'''\n** [[Sponge|Porifera]]\n** [[Placozoa]]\n* '''Subkingdom [[Eumetazoa]]'''\n** '''[[Radiata]] (unranked)'''\n*** [[Ctenophora]]\n*** [[Cnidaria]]\n** '''[[Bilateria]] (unranked)'''\n*** [[Orthonectida]]\n*** [[Rhombozoa]]\n*** [[Acoelomorpha]]\n*** [[Chaetognatha]]\n*** '''Superphylum [[Deuterostomia]]'''\n**** [[Chordata]]\n**** [[Hemichordata]]\n**** [[Echinoderm]]ata\n**** [[Xenoturbellida]]\n**** [[Vetulicolia]] [[extinction|\u2020]]\n*** '''[[Protostomia]] (unranked)'''\n**** '''Superphylum [[Ecdysozoa]]'''\n***** [[Kinorhyncha]]\n***** [[Loricifera]]\n***** [[Priapulida]]\n***** [[Nematoda]]\n***** [[Nematomorpha]]\n***** [[Lobopodia]]\n***** [[Onychophora]]\n***** [[Tardigrada]]\n***** [[Arthropoda]]\n**** '''Superphylum [[Platyzoa]]'''\n***** [[Platyhelminthes]]\n***** [[Gastrotricha]]\n***** [[Rotifera]]\n***** [[Acanthocephala]]\n***** [[Gnathostomulida]]\n***** [[Micrognathozoa]]\n***** [[Cycliophora]]\n**** '''Superphylum [[Lophotrochozoa]]'''\n***** [[Sipuncula]]\n***** [[Hyolitha]] [[extinction|\u2020]]\n***** [[Nemertea]]\n***** [[Phoronida]]\n***** [[Bryozoa]]\n***** [[Entoprocta]]\n***** [[Brachiopoda]]\n***** [[Mollusca]]\n***** [[Annelida]]\n***** [[Echiura]]\n}}\n\n'''Animals''' are a major group of multicellular, [[eukaryotic]] [[organism]]s of the [[Kingdom (biology)|kingdom]] '''Animalia''' or '''Metazoa'''. Their [[body plan]] eventually becomes fixed as they [[Developmental biology|develop]], although some undergo a process of [[metamorphosis]] later on in their life. Most animals are [[Motility|motile]], meaning they can move spontaneously and independently. All animals are also [[heterotroph]]s, meaning they must ingest other organisms or their products for [[sustenance]].\n\nMost known animal [[phylum|phyla]] appeared in the fossil record as marine species during the [[Cambrian explosion]], about 542 million years ago."}]}}}})

person Krishna Deepak    schedule 17.04.2012    source источник
comment
Пробовали ли вы $.parseJSON(jsonObject)?   -  person SpYk3HH    schedule 17.04.2012
comment
@ SpYk3HH - он, очевидно, уже проанализировал его как объект / массив, если он использует его в $.each(), и, поскольку это междоменный запрос и тип данных jsonp, он анализируется автоматически, а $.parseJSON не требуется.   -  person Kevin B    schedule 17.04.2012
comment
@Napster -- Какую часть результата вы хотите прокрутить? Чему равно first?   -  person Kevin B    schedule 17.04.2012
comment
first здесь просто переменная.   -  person Krishna Deepak    schedule 17.04.2012
comment
Как вы хотите отображать данные? Насколько я понимаю, в этом результате есть только один массив, который вы можете прокрутить.   -  person Kevin B    schedule 17.04.2012
comment
как вы видите на вики-страницах. Я хочу отобразить ту же таблицу инфобокса, что и на вики.   -  person Krishna Deepak    schedule 17.04.2012
comment
Думаю, я просто не знаком с тем, о какой таблице информационных блоков вы говорите, я не трачу много времени на википедию.   -  person Kevin B    schedule 17.04.2012
comment
Таблица infoxbox — это первая таблица, которую вы найдете на каждой вики-странице с правой стороны и которая содержит всю важную информацию.   -  person Krishna Deepak    schedule 17.04.2012


Ответы (1)


Если вы хотите, чтобы фактический HTML-код отображался на вики-странице, вместо этого используйте action=parse. . И да, объекты результата глубоко вложены. Но нет причин зацикливаться на них!

  • первым свойством всегда является действие, здесь: query
  • вы запросили свойства страниц, поэтому вы получите pages
  • которые отмечены их идентификатором страницы. Это единственный шаг, чтобы использовать цикл
  • Каждый объект страницы имеет определенные свойства (например, заголовок), вас интересует revisions
  • это массив объектов ревизии, вам нужен единственный и первый
  • свойство исходного текста объекта ревизии — это *

Итак, просто сделайте это:

if (data && data.query && data.query.pages)
    var pages = data.query.pages;
else
    // error: No pages returned / other problems!
for (var id in pages) { // in your case a loop over one property
    if (pages[id].revisions && pages[id].revisions[0] && pages[id].revisions[0]["*"])
        var content = pages[id].revisions[0]["*"];
    else
        // error: No revision content returned for whatever reasons!
}
// use "content" variable here

Не забывайте проверять существование каждого объекта! Если вы не запросили никаких страниц, не будет объекта страницы; это только в том случае, когда "массив" страниц пуст. На странице может отсутствовать / неверный заголовок или что-то еще, поэтому у нее нет ревизий. и Т. Д.

person Bergi    schedule 17.04.2012
comment
это первый раз, когда я имею дело с данными json. Пожалуйста, не могли бы вы подробно объяснить эту строку var pages = data && data.query && data.query.pages; - person Krishna Deepak; 18.04.2012
comment
Это короткая форма для извлечения свойств объектов «может быть, их нет». Возможно, было бы лучше и чище использовать расширенный (обновленный ответ)... - person Bergi; 18.04.2012
comment
большое спасибо. можете ли вы помочь мне с этим, пожалуйста, stackoverflow.com/questions/10207480/wikimedia-api-getting-relavant-data-from-json-string - person Krishna Deepak; 18.04.2012