Доступ к элементу JSON, когда имя родительского ключа неизвестно

Я запрашиваю JSON из API Википедии по адресу

http://en.wikipedia.org/w/api.php?action=query&prop=description&titles=WTO&prop=extracts&exsentences&explaintext&format=json

Ответ выглядит так:

{
    "query": {
        "pages": {
            "ramdom_number_here": {
                "pageid": ramdom_number_here,
                "ns": 0,
                "title": "Hello",
                "extract": "Hello world! Enchanté to meet you"
            }
        }
    }
}

Учитывая, что ramdom_number_here изменяет каждый запрос (поэтому мы этого не знаем), как можно получить доступ к данным extrac или title?


person Hugolpz    schedule 26.10.2013    source источник
comment
Кроме того, вы знаете о параметре indexpageids?   -  person svick    schedule 26.10.2013


Ответы (2)


Используйте Object.keys(data)[x], чтобы заменить номинативный путь на координату ваших данных.

  • Object.keys(data) - дает вам список ключей на этом уровне.
  • Затем используйте x = числовой диапазон ваших целевых данных. Для первой точки данных [x]=[0].

Решение> JSfiddle:

function WD(val) { // input
    target_API_url = "http://zh.wikipedia.org/w/api.php?action=query&prop=description&titles=" + val.toString() + "&prop=extracts&exintro&explaintext&format=json&redirects&callback=?";
    $.getJSON(target_API_url, function (json) {
        trad = json.query.redirects[0].to; // no "var", variable is global
        var item_id = Object.keys(json.query.pages)[0]; // THIS DO THE TRICK !
        sent = JSON.stringify(json.query.pages[item_id].extract);
        result = "<b>En:</b> "+val.toString() + ", <b>Zh: </b>"+trad.toString() +  "<br /><b>⇒</b>" + sent.toString();
        $('p').html(result); // transformation 
    });
};
WD("WTO");

Поощрение +1 приветствуется.

person Hugolpz    schedule 02.11.2013

В JavaScript вы можете:

var a; // assume that a is your json
var title;
for (var obj in a["query"]["pages"])
{
  if (a["query"]["pages"][obj].title != undefined)
  {
   title = a["query"]["pages"][obj].title;
   break;
  }
}
person baltov    schedule 26.10.2013
comment
Это не совсем правильно. obj — это строка (имя узла). Таким образом, в приведенном выше примере это будет "ramdom_number_here" (или любое другое число). Чтобы получить объект, вы должны использовать a["query"]["pages"][obj] - person Umair; 26.10.2013