Размер json объекта? (в КБ/МБ)

Как я могу узнать, сколько данных передается по проводам с точки зрения размера в килобайтах, мегабайтах?

Возьмем например

{
  'a': 1,
  'b': 2
}

Как узнать, каков размер этой полезной нагрузки, а не длина или элементы объекта

ОБНОВИТЬ

content-encoding:gzip
content-type:application/json
Transfer-Encoding:chunked
vary:Accept-Encoding

Ответы

Ответ 1

Для ascii вы можете считать символы, если вы делаете...

JSON.stringify({
  'a': 1,
  'b': 2
}).length

Если у вас есть специальные символы, вы можете пройти через функцию для вычисления длины символов UTF-8...

function lengthInUtf8Bytes(str) {
  // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.
  var m = encodeURIComponent(str).match(/%[89ABab]/g);
  return str.length + (m ? m.length : 0);
}

Должно быть точным...

var myJson = JSON.stringify({
  'a': 1,
  'b': 2,
  'c': 'Máybë itß nºt that sîmple, though.'
})

// simply measuring character length of string is not enough...
console.log("Inaccurate for non ascii chars: "+myJson.length)

// pass it through UTF-8 length function...
console.log("Accurate for non ascii chars: "+ lengthInUtf8Bytes(myJson))

/* Should echo...

Inaccurate for non ascii chars: 54
Accurate for non ascii chars: 59

*/

Рабочая демонстрация

Ответ 2

Вот функция, которая делает эту работу.

function memorySizeOf(obj) {
    var bytes = 0;

    function sizeOf(obj) {
        if(obj !== null && obj !== undefined) {
            switch(typeof obj) {
            case 'number':
                bytes += 8;
                break;
            case 'string':
                bytes += obj.length * 2;
                break;
            case 'boolean':
                bytes += 4;
                break;
            case 'object':
                var objClass = Object.prototype.toString.call(obj).slice(8, -1);
                if(objClass === 'Object' || objClass === 'Array') {
                    for(var key in obj) {
                        if(!obj.hasOwnProperty(key)) continue;
                        sizeOf(obj[key]);
                    }
                } else bytes += obj.toString().length * 2;
                break;
            }
        }
        return bytes;
    };

    function formatByteSize(bytes) {
        if(bytes < 1024) return bytes + " bytes";
        else if(bytes < 1048576) return(bytes / 1024).toFixed(3) + " KiB";
        else if(bytes < 1073741824) return(bytes / 1048576).toFixed(3) + " MiB";
        else return(bytes / 1073741824).toFixed(3) + " GiB";
    };

    return formatByteSize(sizeOf(obj));
};

console.log(memorySizeOf({"name": "john"}));

Ответ 3

JSON-объекты - это объекты Javascript, этот вопрос SO уже показывает способ вычисления грубого размера. <- См. Комментарии/Редактирование

EDIT: ваш реальный вопрос довольно сложно, так как даже если вы можете получить доступ к заголовкам, размер содержимого не показывает значение gzip'ed, насколько я знаю.

Если вы достаточно удачливы, чтобы иметь хороший html5 браузер, это содержит хороший кусок кода:

var xhr = new window.XMLHttpRequest();
   //Upload progress
   xhr.upload.addEventListener("progress", function(evt){
   if (evt.lengthComputable) {
     var percentComplete = evt.loaded / evt.total;
     //Do something with upload progress
     console.log(percentComplete);
     }
   }

Поэтому следующее должно работать (не могу проверить прямо сейчас):

var xhr = new window.XMLHttpRequest();
if (xhr.lengthComputable) {
  alert(xhr.total);
}

Обратите внимание, что XMLHttpRequest является родным и не требует jQuery.

Следующий EDIT:

Я нашел своего рода дубликат (немного другой вопрос, почти такой же ответ). Важная часть этого вопроса

content_length = jqXHR.getResponseHeader("X-Content-Length");

Где jqXHR - ваш XmlHttpRequest.