2013-06-12 3 views
0

У меня есть следующие JSON данные:логика для разбора JSON данных провала попытки

[{"id":"1","name":"vm"},{"id":"2","name":"live"}] 

Вот код, который я должен разобрать:

$.getJSON('<%= path to my method%>',function(data) { 
    console.log(data); 
    $.each(data, function(i, item) {      
        console.log(item[i].id); 
      console.log(item[i].name); 
    }); //end .each 

});//end getJSON.  

Вот результаты в консоли:

LOG: [{"id":"1","name":"vm"},{"id":"2","name":"live"}] 
LOG: undefined 
LOG: undefined 
SCRIPT5007: Unable to get value of the property 'id': object is null or undefined 

Я нашел этот пост: jquery loop on Json data using $.each

и поэтому я попытался изменить свой код, чтобы выглядеть следующим образом:

function(data) { 
    console.log(data); 
    $.each(data, function(i, item) { 
     console.log(data[i].id); 
      console.log(data[i].name); 
    }); //end .each 

и это:

function(data) { 
    console.log(data); 
    $.each(data, function(i, item) { 
    console.log(item.id); 
    console.log(item.name); 
    }); //end .each 

Но я продолжаю получать неопределенный для идентификаторов и имен.

Можете ли вы сказать мне, где я ошибаюсь, пожалуйста? Спасибо.

EDIT 1

function(data) { 
     $.parseJSON(data); 
     console.log(data); 
     $.each(data, function(i, item) { 
      console.log(item.id); 
      console.log(item.name); 
     }); //end .each 
+0

Ваш последний код работает для меня. – SLaks

+2

Бьюсь об заклад, ваши 'данные' содержат строку, а не объект javascript. Возможно, используйте 'data = $ .parseJSON (data);' чтобы передать строку объекту перед вашим 'console.log'. – phpisuber01

+0

phpisuber01, это, похоже, не имеет значения .... Пожалуйста, ознакомьтесь с Редактированием 1 в своем сообщении, чтобы узнать, что код loks нравится –

ответ

1

IIRC

$.each(data,function(i,item) 

должен быть

$.each(data,function(i) 

, то вы можете просто использовать this.id и this.name внутри цикла. Даже если ваше решение оказывается действительным, он все равно будет быстрее использовать шахту, потому что будет для данных [I] будет медленнее, чем просто с помощью «это»

+0

извините, это тоже не исправляет. но я буду использовать это вместо данных [i] –

1

При использовании .each, i является индексом и Значение item. Не нужно до item[i], как вы делаете в for..in.

$.each(data, function(i, item) {      
    console.log(item.id); 
    console.log(item.name); 
}); 
0

Попробуйте это:

$.each(data, function() { 
    console.log(this.id); 
    console.log(this.name); 
}); 
+0

Я думаю, что это спорный вопрос, потому что, как признал один из плакатов, когда OP регистрирует свой json-объект, он проходит как строка. Должна ли консоль отображать ее как [объект] [объект]? – jRoB

0

Ваш JSON приходит через как строку вместо объекта JSON, поэтому вы не можете получить доступ к его свойств.

Включить строку JSON в фактический объект, используя $.parseJSON().

data = $.parseJSON(data); 

Вышеупомянутый должен сделать трюк.

Если источник JSON потенциально ненадежный, я бы предложил попробовать/поймать блоки, чтобы предотвратить недопустимое JSON из borking вашего JavaScript:

try { 
    data = $.parseJSON(data); 
} catch(errors) { 
    console.log(errors); 
} 

Наконец, если вы контролируете источник JSON, вы можете установить заголовки в ответ на application/json, а jQuery должен автоматически реагировать на объект JSON.

+0

Вы имеете в виду 'application/json' :-) –

+0

@RocketHazmat Да! Это тоже. Я считаю, что они взаимозаменяемы. – phpisuber01

+0

Они не на самом деле. 'application/javascript' и' application/json' совершенно разные^_^ –

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