Как обработать объектный литерал? - PullRequest
2 голосов
/ 26 июля 2009

Я новичок в Javascript и пытаюсь извлечь некоторый текст, хранящийся в объекте.

Объект определяется как литерал объекта и передается функции в сценарии Javascript , которыйвызывает функцию. Сценарий (и объект) имеют следующую структуру:

foo({
  "query": {
  "count": "2",
  "created": "2009-07-25T08:17:54Z",
  "lang": "en-US",
  },
  "results": {
   "result": [
    {
     "abstract": "<b>Pizza</b> Hut®. Order Online for Delivery or Carry-out. Fast &amp; Easy.",
     "title": "<b>Pizza</b> Hut"
    },
    {
     "abstract": "Official site of Domino's <b>Pizza</b> delivery chain, which offers thin crust, deep dish, and hand tossed <b>pizzas</b> with a variety of side items and beverages. Site <b>...</b>",
     "title": "Domino's <b>Pizza</b>"
    }
   ]
  }
 }
});

Объект передается в функцию обратного вызова с именем "foo":

function foo(o){
  var out = document.getElementById('container');
  out.innerHTML = o.query.count;
}

Моя проблема: Я знаю, как распечатать переменную счетчика запросов, используя функцию обратного вызова выше, но я не знаю, как распечатать заголовок первого результата в массиве результатов.

Как я могу изменитьфункция обратного вызова для отображения первого заголовка результата? А также, есть ли оператор foreach, где я мог бы распечатать все заголовки из всех результатов?

Спасибо!

ОБНОВЛЕНИЕ: JSBIN для этого кода находится по адресу: http://jsbin.com/ejiwa/edit

Ответы [ 4 ]

4 голосов
/ 26 июля 2009

Работает ли следующее:

o.results.result[0].title

, чтобы получить первый заголовок результата? И перебрать все результаты:

for (var i=0; i<o.results.result.length; i++) {
    var result = o.results.result[i];
    alert(result.title);
}

РЕДАКТИРОВАТЬ: Вы уверены, что вы скопировали это правильно? Вот что я получаю в Rhino:

js> o = {
  "query": {
  "count": "2",
  "created": "2009-07-25T08:17:54Z",
  "lang": "en-US",
  },
  "results": {
   "result": [
    {
     "abstract": "<b>Pizza</b> Hutr. Order Online for Delivery or Carry-out. Fast &amp; Easy.",
     "title": "<b>Pizza</b> Hut"
    },
    {
     "abstract": "Official site of Domino's <b>Pizza</b> delivery chain, which offers thin crust, deep dish, and hand tossed <b>pizzas</b> with a variety of side items and beverages. Site <b>...</b>",
     "title": "Domino's <b>Pizza</b>"
    }
   ]
  }
 }

js> o.results.result[0].title
<b>Pizza</b> Hut
1 голос
/ 26 июля 2009

Фактический объект имеет немного другую структуру, чем вы написали. results на самом деле является элементом query. Так попробуйте это:

o.query.results.result[0].title
1 голос
/ 26 июля 2009

Я не уверен, что параметр o находится в вашей функции обратного вызова. Я обычно назначаю XMLHttpRequest или ActiveXObject глобальному var req.

Затем использую обратный вызов:

 function json_callback() {
    if (req.readyState == 4) {
            if (req.status == 200) {
                    jsonObj = eval("(" + req.responseText + ")");
                    var out = document.getElementById('container');
                    out.innerHTML = jsonObj.query.count;
            }
       }
 }

Следует отметить, что вы должны использовать eval (), только если вы полностью доверяетесервер и данные сервер отправляет клиенту. Доступны парсеры JSON, которые на самом деле быстрее, чем eval (), а также более безопасны, поскольку ограничивают его только JSON, тогда как eval () может анализировать и выполнять весь JavaScript, что может представлять угрозу безопасности. Ожидается, что в следующей версии ECMAScript будет встроен стандартный анализатор JSON.

1 голос
/ 26 июля 2009

Как вы можете видеть из JSON, у объекта есть свойство с именем "results", которое содержит свойство с именем "result", которое является массивом объектов.

Чтобы отобразить первое из этого, вы простопоступайте так же, как вы уже сделали с count, но просто следуйте структуре к заголовку.

o.query.results.result[0].title

Чтобы перебрать каждый результат, вы можете просто перебрать свойство результата как массив, например, так:

var results = o.query.results.result;
for(var i = 0; i < results.length; i++) {

}

JSON - это просто код JavaScript. Думайте о фрагменте JSON как о объявлении объекта JavaScript, и у вас не должно возникнуть проблем с его пониманием.

...