2009-07-25 5 views
2

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

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

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, где я могу распечатать все названия из всех результатов?

Спасибо!

UPDATE: JSBIN для этого кода по адресу: http://jsbin.com/ejiwa/edit

+0

Вопрос неправильно - не разобрать JSON, вы работаете с соединением JavaScript переменного – zakovyrya

+1

@ Крис: Там опечатка в коде - у вас есть дополнительная закрывающая фигурная скобка в конце вашего звонка на 'foo()'. – RichieHindle

+0

@Richie: Спасибо, я не заметил, что – chris

ответ

4

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

o.results.result[0].title 

получить первый титул результата? И для повторения результатов:

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

EDIT: Вы уверены, что вы скопировали его правильно? Вот что я получаю в 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 
+0

нет, к сожалению, это не – chris

+1

@chris: код ars отлично работает для меня, хотя мне пришлось исправить опечатку в вашем коде - у вас есть дополнительная закрывающая скобка в конце вашего вызова 'foo()'. – RichieHindle

+0

Странно. Смотрите результат, который я только что вставил с моей стороны. – ars

1

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

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

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

Для цикла по каждому результату, вы можете просто цикл по свойству результата, как массив, например, как это:

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

} 

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

+0

Использование этого утверждения: out.innerHTML = o.results.result [0] .title; похоже, не работает. – chris

+0

Ah цифры .. o.query.results.result [0] .title - правильный путь: P Похоже, что вы ошиблись в своем скриншоте JSON, который был вставлен –

1

Я не уверен, что параметр 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

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

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

. Думаю, я ошибся, пытаясь превзойти код, но firebug говорит : o.query.results не определено – chris

+0

Это работает для меня, когда я запускаю это по исходным данным из Yahoo. 'function foo (o) {return o.query.results.result [0] .title; } 'возвращает' Пицца Хижина. – Gumbo

+0

Ничего, ты прав. Благодаря!!! – chris