JSON.stringify для вложенного объекта игнорирует вложенные объекты

Я создаю объект, который выглядит так, когда вы просматриваете его в Chrome:

объект в инспекторе Chrome

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

{
    "results" : [{
            "ID" : 1,
            "NAME" : "Admin"
        }, {
            "ID" : 2,
            "NAME" : "Standarduser"
        }, {
            "ID" : 3,
            "NAME" : "Consultant"
        }, {
            "ID" : 4,
            "NAME" : "Leergruppe"
        }
    ]
}

По какой-то причине все вложенные узлы отсутствуют. Я уверен, что это довольно просто и очевидно, но на данный момент я просто не могу найти свою ошибку. Большое спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: JSFiddle, как создается JSON: http://jsfiddle.net/VJTaV/


person user2345998    schedule 27.03.2014    source источник
comment
Как вы строите этот объект? Я создал тот же объект, и JSON.stringify отлично работает: jsfiddle.net/H8CF2   -  person Rocket Hazmat    schedule 27.03.2014
comment
Привет, Ракета, я отредактировал свой вопрос и создал запись на jsfiddle. Он не работает, но я думаю, этого достаточно, чтобы понять, как он создается.   -  person user2345998    schedule 27.03.2014


Ответы (2)


Поскольку ваш jsfiddle показывает вызов ajax, вероятно, вы вызвали JSON.stringify() до того, как будут доступны результаты ajax. Вам нужно будет поместить его в обратный вызов успеха, который будет выполнен после завершения ajax.

Инспектор Chrome покажет свойства, так как когда вы изменяете объект после того, как он был зарегистрирован, вы позже можете развернуть и увидеть новые свойства, которые еще не существовали на момент вызова console.log.

person Bergi    schedule 27.03.2014
comment
Спасибо, конечно, по этой причине. На данный момент я изменил вызов .get на вызов .ajax и сделал его синхронным. - person user2345998; 28.03.2014

Как заявил Берги, вы пытаетесь структурировать данные, которые еще не загружены, потому что вызовы $ .get асинхронны. Вы можете прикрепить обратный вызов .done к каждому из них или, если вы хотите выполнить код только после завершения всех запросов, используйте jQuery.when:

var jqXHRs = [];

$( data.results ).each(function( key, val ) {
  var jqXHR = $.get( userDataUrl, "", function( res ) {
    // ...
  });

  jqXHRs.push(jqXHR);
});

$.when.apply( $, jqXHRs ).done(function() {
    console.log( val ); // will log all nested nodes
});
person Anthony Garcia-Labiad    schedule 27.03.2014
comment
Большое спасибо за этот ввод, но один вопрос: вы пишете, что я могу прикрепить .done к каждому запросу, но я не вижу разницы в использовании успешного обратного вызова на данный момент. - person user2345998; 28.03.2014
comment
Обратный вызов success - это старый API, теперь вместо него рекомендуется использовать .done, но результат тот же. - person Anthony Garcia-Labiad; 28.03.2014