Проблемы с форматированием массива json

0

Как ответ от сервера я получаю:

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

Итак, что я делаю с этим Json Array 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
Теги:

5 ответов

1
Лучший ответ

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

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

Кажется, вы хотите записать имя, поэтому вам нужно записать i, а не значение val:

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

Примером в документации является довольно самоочевидная ИМО:

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

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

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

flammable: inflammable
duh: no duh
2

Если вы хотите просто получить key имя свойства. Я предлагаю вам использовать простой сквозной цикл

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

РЕДАКТИРОВАТЬ

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

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

DEMO с данными JSON, включая как входные, так и $.

  • 0
    Хотя это, безусловно, обеспечивает решение, оно не объясняет проблему.
  • 0
    @FelixKling, извините, мне было лень не давать объяснений. Я думаю, что код не требует пояснений, поэтому пропустил
1

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

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

ответ:

vorname: muss ausgefüllt werden имя: muss ausgefüllt werden

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-^^--

где item before : в предупреждении - это ключ в объекте json, а другой - соответствующее значение.

  • 0
    Почему ОП должен попробовать это? Можете ли вы дать объяснение ?
  • 0
    @FelixKling Я писал об этом.
0

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

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

Вот демо.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню