2014-02-21 2 views
0

В ответ от сервера я получаю:Проблемы с массивом форматирования JSon

{"vorname":["muss ausgefüllt werden"],"name":["muss ausgefüllt werden"]} 

Так что я делать с этим Json массива xhr.responseText это:

$.each(jQuery.parseJSON(xhr.responseText), function(i, val) { 
      console.log(val[0]); 
    }); 

Обычно я бы ожидать, этот вывод:

vorname  
name 

Но я получаю:

muss ausgefüllt werden 
muss ausgefüllt werden 

Почему? И как мне это исправить? Спасибо

+0

Что вы хотите '' i' не val' – Spokey

ответ

1

Почему? И как мне это исправить?

Результат jQuery.parseJSON(xhr.responseText) является объектом и $.each передает имя свойства в качестве первого аргумента, и его значение в качестве второго аргумента функции обратного вызова.

Кажется, что вы хотите, чтобы войти имя, так что вы должны войти i, а не значение val:

$.each(jQuery.parseJSON(xhr.responseText), function(i, val) { 
    console.log(i); 
}); 

Пример в documentation довольно очевидны IMO:

Если объект используется в качестве коллекции, обратный вызов передается парам ключ-значение каждый раз:

var obj = { 
    "flammable": "inflammable", 
    "duh": "no duh" 
}; 
$.each(obj, function(key, value) { 
    alert(key + ": " + value); 
}); 

Еще раз, это производит два сообщения:

flammable: inflammable 
duh: no duh 
2

Если вы хотите просто получить key название объекта. Я хотел бы предложить вам использовать простой for-in loop

for (var item in jQuery.parseJSON(xhr.responseText)) { 
    console.log(item) 
} 

EDIT

В настоящее время вы печатаете value, где, как вам нужно, чтобы получить key имя свойства. Поэтому вы должны напечатать key первый аргумент каждого обратного вызова. Таким образом, вы можете использовать.

$.each(data, function(key, val) { 
    console.log(key); 
}); 

DEMO with JSON data including both for-in and $.each

+0

Хотя это, безусловно, обеспечивает решение, это не объясняет проблему. –

+0

@FelixKling, Извините, я ленился, чтобы не дать объяснений. Я думаю, что код сам объясняет, поэтому пропустил это – Satpal

1

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

$.each(jQuery.parseJSON(xhr.responseText), function (key, val) { 
    console.log(key); 
}); 

Вы должны вернуть key вашего JSon объекта, согласно документации $.each():

Если Объект используется как коллекция (в вашем случае тоже), обратный вызов передается парой ключ-значение каждый раз.

var obj = { 
    "flammable": "inflammable", 
    "duh": "no duh" 
}; 
$.each(obj, function(key, value) { // key returns key of json object. 
    alert(key + ": " + value); // alert(flammable: inflammable); 
});        //----------^^key^^----^^-value-^^-- 

это предупреждает два раза, как

flammable: inflammable // alert(flammable: inflammable); 
duh : no duh    //--^^key^^----^^-value-^^-- 

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

+0

Зачем нужно это делать? Можете ли вы предоставить ** объяснение **? –

+0

@FelixKling я писал об этом. – Jai

0

Потому что вы печатаете VAL, а не KEY. ли есть то, что вы ожидаете:

$.each(jQuery.parseJSON(xhr.responseText), function(key , val) { 
     console.log(key); 
}); 

Here a demo.

Объяснение: Если вы посмотрите на JQuery API:

"[..] $ .each() функция может быть использована для перебора любой коллекции, будь то объект или массив [ . ..] метод возвращает свой первый аргумент, объект, который был итерированным [..] "

1

попробовать это:

var obj = jQuery.parseJSON(yourResponse) 
for (var key in obj){ 
    console.log(key + ':' + obj[key]) 
} 

ответ:

Vorname: мусс ausgefüllt Werden Имя: мусс ausgefüllt Werden

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