json对象的大小? (以KB / MB为单位)

时间:2014-04-27 00:25:57

标签: javascript json

我如何知道通过线路传输的数据大小(千字节,兆字节)?

以示例为例

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

我如何知道此有效负载的大小是多少,对象的长度或项目

更新

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

5 个答案:

答案 0 :(得分:11)

实际问题的答案应包括标头上使用的字节,并应考虑gzip压缩,但我将忽略这些内容。

您有一些选择。运行时它们都输出相同的答案:

如果使用浏览器或节点(不是IE)

const size = new TextEncoder().encode(JSON.stringify(obj)).length
const kiloBytes = size / 1024;
const megaBytes = kiloBytes / 1024;

如果需要在IE上运行,可以使用pollyfill

如果使用节点

const size = Buffer.byteLength(JSON.stringify(obj))

(与Buffer.byteLength(JSON.stringify(obj), "utf8")相同)。

可在IE,现代浏览器和节点中使用的快捷方式

const size = encodeURI(JSON.stringify(obj)).split(/%..|./).length - 1;

最后一个解决方案几乎在所有情况下都可以使用,但是如果您输入的最后一个解决方案包含不应该存在的字符串(如URIError: URI malformed),则该最后一个解决方案将引发let obj = { partOfAnEmoji: "??"[1] }异常。我提供的其他两个解决方案不会有这个弱点。

信用:第一个解决方案的信用为here。 第二种解决方案归功于utf8-byte-length软件包(很好,您可以改用它)。 最后一个解决方案的大部分功劳归功于here,但我对此做了一些简化。 研究此书时,我发现utf8-byte-length软件包的测试套件非常有用。)

答案 1 :(得分:9)

对于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

*/

Working demo

答案 2 :(得分:4)

这是一个完成工作的功能。



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"}));
&#13;
&#13;
&#13;

我从以下网址获得了摘录

  

https://gist.github.com/zensh/4975495

答案 3 :(得分:1)

Buffer.from(JSON.stringify(obj)).length将为您提供字节数。

答案 4 :(得分:0)

JSON对象是Javascript对象,this SO question已经显示了计算粗略大小的方法。&lt; - 请参阅评论/编辑

编辑:你的实际问题非常困难,即使你可以访问标题,就我所知,content-size并没有显示gzip的值。

如果你有幸有一个好的html5浏览器,this包含一段很好的代码:

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。

下一次编辑:

我找到了kind-of duplicate(稍微不同的问题,几乎相同的答案)。这个问题的重要部分是

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

jqXHR是你的XmlHttpRequest。