2011-05-18 5 views
12

Я получаю ответ JSON от сервера, и мне нужно пройти через массив в javascript и получить значения. Но я не могу его пропустить.Как пропустить ассоциативный массив JSON в javascript?

Ответ JSON массива выглядит следующим образом:

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

Я просто хочу, чтобы петли через него, чтобы получить идентификатор и имя и заполнить некоторые значения на этой странице.

Я пробовал:

$.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 

и т.д. и т.п.

Так что означает его проходит через весь ответ в виде строки и spliting его как ключ/значение.

Благодаря

+1

Какие «неправильные значения» вы получаете? – jvenema

+0

Что происходит, когда вы пытаетесь использовать эти (казалось бы, правильные) стратегии? Вы получите лучшие ответы, если вы включите ошибочные значения ... – maerics

+1

Ваш второй пример отлично работает: http://jsfiddle.net/vgvw9/ Что именно не работает? – JohnP

ответ

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

+0

, если URL-адрес, по которому вы извлекаете данные, размещен на другом сайте, вам нужно убедиться, что данные кодируются json на их конце и изменяет тип dataType на «jsonp». jQuery добавляет хеш обратного вызова в запрос, чтобы он знал, к какой функции возвращается результат. Имейте в виду, что сторонняя сторона должна быть json_encoded или mime-type будет некорректным при выполнении обратного вызова. –

+0

@DaveCottrell Это кажется совершенно не связанным с самим вопросом, не уверен, почему вы почувствовали необходимость добавить комментарий. Конечно, есть проблемы с перекрестными доменами, но OP не спрашивает об этом, они забыли разобрать JSON, вы просто добавляете шум ... –

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

Вы можете использовать конструкцию for-in в чистом Javascript. Конечно, вы должны быть осторожны, что вы только глядя на собственные свойства объекта (библиотеки Prototype, как правило, загрязняют):

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

EDIT

Вы используете jQuery.ajax? Что такое значение dataType? Он должен быть json. Возможно, поэтому ваш ответ интерпретируется как строка. Кроме того, когда вы ответите console.log, он отображается как строка или объект?

+0

@Vivin: Почему вы используете hasOwnProperty? Используете ли вы Prototype или другую библиотеку, которая дополняет прототип объекта? В противном случае литерал-объект будет только циклически выполнять значения в th e JSON. –

+0

@JuanMendes: Это то, что я делаю, чтобы быть в безопасности (я, вероятно, просто параноик). Если вы уверены, что никогда не собираетесь использовать библиотеку, которая загрязняет пространство имен, тогда нет необходимости в 'hasOwnProperty'. –

+0

@Vivin Paliath: Это довольно плохой компромисс: «Я собираюсь обернуть все мои петли с помощью hasOwnProperty, потому что однажды я могу использовать библиотеку, которая дополняет Object.prototype». Даже Prototype прекратил это делать, потому что видел, насколько это плохо (они были вынуждены). Я думаю, что это глупый предохранительный клапан. Такое же зло, как преждевременная оптимизация. Если библиотека дополняет собственные объекты, я держусь подальше от нее, сейчас не так много libs. Думайте YAGNI http://en.wikipedia.org/wiki/You_ain't_gonna_need_it. Кроме того, для примеров SO вы должны держать их как можно более тонкими. –

2

Вам не нужно так поступать, работа со строкой - это скучная работа. Вы можете сделать объект через ответ. 1: json = eval(xmlHttp.responseText);

но это небезопасно в некоторой степени.

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

, то вы можете управлять переменной как обычный объект, как этот obj.a или OBJ [ "а"].

Это поможет вам.

Смежные вопросы