如何处理对象文字?

时间:2009-07-25 20:25:59

标签: javascript json yql

我是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声明,我可以打印出所有结果中的所有标题?

谢谢!

更新:此代码的JSBIN位于:http://jsbin.com/ejiwa/edit

4 个答案:

答案 0 :(得分: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);
}
编辑:你确定你复制了吗?这是我在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 :(得分:1)

从JSON中可以看出,该对象有一个名为“results”的属性,它包含一个名为“result”的属性,它是一个对象数组。

要显示其中的第一个,您只需按照已经使用的数量进行操作,但只需按照结构更改为标题。

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

要遍历每个结果,您可以像数组一样循环遍历结果属性,例如:

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

}

JSON只是JavaScript代码。将JSON片段视为JavaScript对象声明,理解它应该没有问题。

答案 2 :(得分: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解析器。

答案 3 :(得分:1)

actual object的结构与你写的略有不同。 results实际上是query的元素。所以试试这个:

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