2011-05-18 139 views
12

我得到了服务器的JSON响应,我必须在javascript中循环访问数组并获取值。但我似乎无法循循善诱。如何在JavaScript中循环遍历JSON关联数组?

数组的JSON响应如下所示:

{ 
   "1": "Schools", 
   "20": "Profiles", 
   "31": "Statistics", 
   "44": "Messages", 
   "50": "Contacts" 
} 

我只是想通过它循环获取ID和姓名,并在页面上填入一些值。

我曾尝试:

$.each(response, function(key, value) { 
    alert(key + ' ' + value); 
}); 

// and 

for (var key in response) { 
    alert(key + ' ' + response[key]); 
} 

但无论给出正确的价值观。

在此先感谢您的帮助。

回复: 嗨, 我与第二个循环得到的回应是:

0 { 
1 " 
2 1 
3 " 
4 : 
5 " 
6 S 

等等等等

因此,这意味着它的经历作为一个字符串整个响应和劈裂它作为关键/价值。

感谢

+1

你得到了什么“错误的价值”? – jvenema 2011-05-18 15:50:42

+0

当你尝试这些(看似正确的)策略时会发生什么?如果包含错误值,则会得到更好的答案... – maerics 2011-05-18 15:51:18

+1

第二个示例正常工作:http://jsfiddle.net/vgvw9/究竟哪些方法无效? – JohnP 2011-05-18 15:53:11

回答

17

你的问题是你不解析JSON字符串。因此,您的foreach正在浏览JSON字符串中的字符。我敢打赌它会在IE < 7中失败,因为它不会将字符串当作字符数组。

// If you are using jQuery.ajax, you can just set dataType to 'json' 
// and the following line will be done for you 
var obj = jQuery.parseJSON(response); 
// Now the two will work 
$.each(obj, function(key, value) { 
    alert(key + ' ' + value); 
}); 


for (var key in obj) { 
    alert(key + ' ' + response[key]); 
} 
+0

谢谢你,工作。 – ssin 2011-05-19 09:00:49

+0

如果您要将数据从其他网站上托管的网址托管在不同的网站上,则需要确保数据在其末尾进行了json编码,并将数据类型更改为“jsonp”。 jQuery向请求添加回调哈希,以便知道将结果返回给哪个函数。请记住,第三方必须是json_encoded,否则在进行回调时,mime类型将不正确。 – 2012-11-16 20:15:04

+0

@DaveCottrell这似乎完全不相关的问题本身,不知道为什么你觉得有必要添加评论。确定存在跨域问题,但OP没有问这个问题,他们忘记解析JSON,你只是增加了噪音...... – 2012-11-16 20:20:32

1

http://jsfiddle.net/sG5sF/

jQuery.each工作正常。那么,for-each循环

http://jsfiddle.net/TfjrS/

他们两人的工作,因为他们应该。您的代码的其他部分可能有错误。 response变量是否正确地设置为您的问题中给出的JSON对象?你正在检查响应statusCode?对于成功的回应应该是200呢?

2
var response = {"1":"Schools","20":"Profiles","31":"Statistics","44":"Messages","50":"Contacts"}; 

for (var i in response) { 
    console.log(i + ' ' + response[i]); 
} 

工作得很好,你如何得到你的回应var?

0

您可以在纯Javascript中使用for-in构造。当然,你要小心,你只能看物体本身的属性(比如原型库往往污染):

for(var key in response) { 
    if(response.hasOwnProperty(key)) { 
     ... 
    } 
} 

编辑

是否使用jQuery.ajax?什么是dataType值?它应该是json。这可能就是为什么你的回答被解释为一个字符串。另外,当你的回应是console.log时,它显示为一个字符串还是一个对象?

+0

@Vivin:你为什么使用hasOwnProperty?你在使用原型还是其他库来扩充Object的原型?否则,一个文字对象将只循环第e JSON。 – 2011-05-18 18:08:49

+0

@JuanMendes:我只是为了安全起见(我可能只是偏执狂)。如果您确定永远不会使用污染名称空间的库,那么不需要hasOwnProperty。 – 2011-05-18 18:10:45

+0

@Vivin Paliath:这是一个非常糟糕的折衷,“我将用hasOwnProperty包装所有的循环,因为我可能有一天会使用扩充Object.prototype的库”。即使Prototype停止这样做,因为他们看到它有多糟糕(被迫)。我认为那是一个愚蠢的安全阀。与过早优化一样邪恶。如果一个图书馆增加本地对象,我远离它,现在没有多少库。想想YAGNI http://en.wikipedia.org/wiki/You_ain't_gonna_need_it。另外,对于例子来说,你应该尽可能的保持苗条。 – 2011-05-18 18:23:58

2

你不需要这样做,处理字符串是一件无聊的工作。你可以通过响应来创建一个对象。 1:json = eval(xmlHttp.responseText);

但是这在某种程度上是不安全的。

  1. json = JSON.parse(xmlHttp.responseText, function(key,value){// can do some other stuff here.});

然后可以操作变量作为这样obj.a或OBJ [ “一个”]正常对象。

愿这能帮助你。