【问题标题】:Size of json object? (in KBs/MBs)json对象的大小? (以 KB/MB 为单位)
【发布时间】:2014-06-12 15:19:57
【问题描述】:

我如何知道通过线路传输的数据量(以千字节、兆字节为单位)?

举个例子

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

我怎么知道这个有效载荷的大小是多少,不是对象中的长度或项目

更新

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

【问题讨论】:

  • 取决于你的编码,它是什么?
  • 还取决于您的网络服务器是否自动压缩响应...
  • 也依赖于压缩,gzip对于传输json很常见。
  • 这里仍然几乎没有任何细节。你是如何传输 JSON 的?你的代码在哪里?如果您自己将其作为字符串传递(而不是某些库为您序列化它),那么只需在应用 Unicode 魔术之后计算字符串中的字符数,如下面的答案中所述。

标签: javascript json


【解决方案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

*/

Working demo

【讨论】:

  • 不过,可能并没有那么简单。
  • @AlexWayne 你可以结合这样的东西:stackoverflow.com/a/5515960/665261
  • If you multiply this by 8 you should get bytes for ascii strings. 为什么要乘以 8?
  • @LightnessRacesinOrbit 因为已经晚了:)
  • @BillyMoon:你的意思是......因为它是l8? ;)
【解决方案2】:

JSON 对象是 Javascript 对象,this SO question 已经展示了一种计算粗略大小的方法。

编辑:您的实际问题非常困难,因为即使您可以访问标题,据我所知,内容大小也不会显示 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。

【讨论】:

  • 不要简单地链接到您的另一个答案。如果您觉得这个问题与另一个问题重复,请将其标记出来。
  • 我的声望不够高:/
  • 不,JSON 对象不是 JavaScript 对象。由于这个原因,您链接到的答案是错误的,还因为它甚至没有尝试计算词汇(字符串)表示中的字节数。
  • @Sebb 您的声望高到可以举报。
【解决方案3】:

这是一个完成这项工作的函数。

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

我从以下 URL 获得了 sn-p

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

【讨论】:

  • 不准确.. 即使 utf8 给出更高的数字
【解决方案4】:

Buffer.from(JSON.stringify(obj)).length 会给你字节数。

【讨论】:

    【解决方案5】:

    实际问题的答案应包括在标头上花费的字节数,并应包括考虑 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、现代浏览器和 Node 的快捷方式

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

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

    (致谢:第一个解决方案的致谢去here。 第二种解决方案的功劳归功于 utf8-byte-length 包(这很好,您可以改用它)。 最后一个解决方案的大部分功劳归于here,但我稍微简化了一点。 在研究这个时,我发现 utf8-byte-length 包的测试套件非常有用。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多