получить размер объекта JSON

235

у меня есть объект json, который возвращается по запросу AJAX, и у меня возникают некоторые проблемы с ним, .lengthпотому что он продолжает возвращаться undefined. Просто интересно, правильно ли я это использую:

console.log(data.length);
console.log(data.phones.length);

Они оба возвращаются, undefinedдаже если они являются действительными объектами.

Обновление:
образец возвращенного объекта JSON:

{"reqStatus":true,"phones":{"one":{"number":"XXXXXXXXXX","type":"mobile"},"two":{"number":"XXXXXXXXXX","type":"mobile"}}}
nkcmr
источник
Можете ли вы опубликовать образец возвращенного JSON?
Джо
Я не уверен, не я. Я думаю, что ваш вопрос тоже в порядке.
Джо

Ответы:

556

Вы можете использовать что-то вроде этого

<script type="text/javascript">

  var myObject = {'name':'Kasun', 'address':'columbo','age': '29'}

  var count = Object.keys(myObject).length;
  console.log(count);
</script>
Kasun
источник
62
@ Matt, НЕ обязательно для каждого кода работать в IE 7 или 8. Эти неадекватные или нестандартные защищаемые платформы являются просто недостатками.
Олофу Марк
5
@OlofuMark Не все могут выбирать, какой браузер они используют (например, закрытые сети, зависимости версий DLL-библиотек IE, используемые в собственных приложениях). Если адаптация устаревших браузеров требует значительных усилий, игнорирование их может быть оправдано, но в таком тривиальном случае, как этот, просто грубо не делать
tomfumb
7
@OlofuMark Хотя поддержка этих версий не требуется, разработчики должны знать, когда создаваемый ими код не будет работать на определенных версиях, чтобы они могли решить, принять это во внимание или нет.
Дэвид Наварр
Приятно видеть решение, которое не требует, чтобы JSON имел вложенные массивы. Я думал, что весь смысл JSON в том, чтобы все было объектом.
Healforgreen
это фантастическое решение для получения длины объектов json
Shaymol Bapary
54

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

  1. Измените структуру JSON (при условии, что это возможно), чтобы «телефоны» стали

    "phones":[{"number":"XXXXXXXXXX","type":"mobile"},{"number":"XXXXXXXXXX","type":"mobile"}]

    (обратите внимание, что для каждого телефона нет нумерованного идентификатора, поскольку они возвращаются в 0-индексированном массиве). В этом ответ phones.lengthбудет действительным.

  2. Перебирайте объекты, содержащиеся в объекте вашего телефона, и считайте их по мере необходимости, например:

    var key, count = 0;
    for(key in data.phones) {
      if(data.phones.hasOwnProperty(key)) {
        count++;
      }
    }

Если вы ориентируетесь только на новые браузеры, вариант 2 может выглядеть следующим образом

tomfumb
источник
Как получить длину объекта JSON с первым решением, учитывая, что мой объект JSON хранится в переменной с именем jsonObject, и у меня тот же JSON, что и выше: "phones": [{"number": "XXXXXXXXXX" , "type": "mobile"}, {"number": "XXXXXXXXXX", "type": "mobile"}]
Эрик
29

Подумайте об использовании underscore.js . Это позволит вам проверить размер, например, так:

var data = {one : 1, two : 2, three : 3};
_.size(data);
//=> 3
_.keys(data);
//=> ["one", "two", "three"]
_.keys(data).length;
//=> 3
ForestierSimon
источник
24

Вам не нужно менять формат JSON.

заменить:

console.log(data.phones.length);

с участием:

console.log( Object.keys( data.phones ).length ) ;
KKK
источник
16
var json=[{"id":"431","code":"0.85.PSFR01215","price":"2457.77","volume":"23.0","total":"565.29"},{"id":"430","code":"0.85.PSFR00608","price":"1752.45","volume":"4.0","total":"70.1"},{"id":"429","code":"0.84.SMAB00060","price":"4147.5","volume":"2.0","total":"82.95"},{"id":"428","code":"0.84.SMAB00050","price":"4077.5","volume":"3.0","total":"122.32"}] 
var obj = JSON.parse(json);
var length = Object.keys(obj).length; //you get length json result 4
Сурья Хандоко
источник
2
Это уже проанализированный объект JSON. Если вы выполните приведенные выше операторы, вы получите ошибку «Неожиданный токен в Json». Для вычисления длины json вы можете напрямую сделать var length = Object.keys (json) .length.
Ааюши
-3

использовать этот

//for getting length of object
 int length = jsonObject.length();

или

//for getting length of array
 int length = jsonArray.length();
Махеш Гаван
источник
6
length () не является функцией объекта JSON
Sunding Wei
-5
$(document).ready(function () {
    $('#count_my_data').click(function () {
        var count = 0;
        while (true) {
             try {
                var v1 = mydata[count].TechnologyId.toString();
                count = count + 1;
            }
            catch (e)
            { break; }
        }
        alert(count);
    });
});
user2674838
источник
1
ожидание исключения, сообщающего о том, что в вашем списке исчерпаны элементы, - плохая идея, и этот подход автоматически выдаст неверное число, если какой-либо элемент (даже последний) пропустит TechnologyIdсвойство
tomfumb
1
Этот код настолько плох, что я даже не буду комментировать дальше. Проголосовал -1!
Георгий-это