Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Применение библиотек > jquery ajax json length


Автор: Muchenik 13.1.2010, 18:50
Доброго времени суток. Прошу подсказки.
Проблема с получением размера объекта, который получается через Ajax. 

есть код
Код

    jQuery.ajax({
        type: "POST",
        url: "index.php?p=action",
        dataType: 'json',
        cache: false,
        success: function(ret) {
            alert(ret.data.length);
            jQuery.each(ret.data, function(key, value) {
                    alert(key + ' ' + value);
            });
    });


Скрипт получает массив в json вида  {"data":{"236":"1109"},"uid":"972"}

Проблема заключается в том, что не определяется размер массива ret.data (размер ret также не определяется) и код
Код

alert(ret.data.length);


выводит undefined

, хотя  код ниже
Код

            jQuery.each(ret.data, function(key, value) {
                    alert(key + ' ' + value);
            });


отрабатывает правильно и выводит все элементы.

В заголовки отправляется Content-Type: text/html; charset=utf-8

при выводе alert(ret.data) выводит [object Object]

Спасибо.





Автор: IDVsbruck 14.1.2010, 14:25
Непонятно что ты не понял и что у тебя не получается.
В запросе ты задал dataType="json", это значит, что на выходе ты получишь объект. Какой может быть размер у объекта???
Если надо сначала получить размер получаемой строки, то задавай тип как текст, замеряй размер, а потом eval("(" + ... + ")"). Но нужно ли оно?
Или внеси изменение в библиотеку jQuery, чтобы до конвертации ответа в объект заносило ее размер в поле.

Автор: Muchenik 15.1.2010, 00:59
На входе я раскладываю массив в json.

"Какой может быть размер у объекта???" - jquery умеет получать размер объекта
Код

$("#div").size();
$("#div").length;


или даже с json вот так все работает

Код

var tmp;
$.getJSON("json.txt", function(json) {
                tmp = eval(json);
});
alert(tmp.length);


Т.е. мне нужно получить размер моего исходного массива. IDVsbruck, тебе понятно???

Автор: IDVsbruck 15.1.2010, 16:14
Конечно! smile Была сначала мысль, что, возможно, ты хочешь получить количество элементов объекта, но увидел, что с сервера ты отправляешь не массив, а объект ... Размер свойством length можно получить только у перечесляемых объектов, а простой объект (Object) таковым не является.
Если же хочется воспользоваться jQuery, то и тут "засада": и size(), и length определяют размер у jQuery-объектов, к коим простой Object не относится.

Так что совет - если ты все-таки отсылаешь с сервера массив, то делать это надо корректно, если все-таки объект с набором полей, то таки прийдется использовать цикл для обхода всех полей для получения их количества.

Автор: 12345c 15.1.2010, 20:05
IDVsbruck, он хеш массивом называет, ему надо получить длину сериализованного хеша: ).

Muchenik, смотрите в jQuery:
Код

            // Get the JavaScript object, if JSON is used.
            if ( type == "json" )
                data = window["eval"]("(" + data + ")");
        }
 - это то, чем отличеает метод приёма json от text. Ничто не мешает получить данные с типом text
, измерить длину, а потом выполнить указанную строчку, чтобы получить json.

Автор: IDVsbruck 16.1.2010, 12:19
Цитата(12345c @  15.1.2010,  20:05 Найти цитируемый пост)
Ничто не мешает получить данные с типом text
, измерить длину

Ха, ты на ту же удочку попался ... это ему не надо.

А сериализованный хеш или просто json-объект - как его не назови - это в любом случае не перечисляемый тип и одной функцией длину не получшь - надо пробегать по нему для поиска длины.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)