首页 > 解决方案 > 如何从 Google Apps 脚本中的压缩 blob 中恢复 JSON 字符串?

问题描述

我需要将一个大的 json 存储到电子表格的一个单元格中。由于有 50k 个字符的限制,我想到了压缩 json 字符串。我设法将压缩的 blob 存储为 base64 编码的字符串,但我无法将其恢复为原始 json。当调用 readLargeJson 函数时,我收到以下错误:“Blob 对象必须具有此操作的非空内容类型”。

下面的 insertLargeJson 函数似乎工作正常。

我也尝试在不使用 base64 编码的情况下进行存储,但没有帮助。

function insertLargeJson()
{
    var obj = {};
    obj["dummy"] = [];

    // Just to make the json huge
    for (var i = 0; i < 10000; i++)
    {
        obj["dummy"].push("value");
    }

    var activeSheet = SpreadsheetApp.getActiveSheet();

    var str = JSON.stringify(obj);

    var blob = Utilities.newBlob(str, 'application/octet-stream');
    var compressedBlob = Utilities.zip([blob]);

    var encoded = Utilities.base64Encode(compressedBlob.getDataAsString());

    activeSheet.getRange(1, 1).setValue(encoded);

}

function readLargeJson()
{
    var activeSheet = SpreadsheetApp.getActiveSheet();

    var values = activeSheet.getSheetValues(1, 1, 1, 1);

    var value = values[0, 0];

    var decoded = Utilities.base64Decode(value);

    var blob = Utilities.newBlob(decoded);

    var unzipped = Utilities.unzip(blob);

    var obj = JSON.parse(unzipped.getDataAsString());

    Browser.msgBox('Test Json array size', "" + obj["dummy"].length, Browser.Buttons.OK);
}

我不一定需要使用 blob 接口来压缩 json,任何可以压缩 json 字符串并且可以存储在单元格中以便以后检索原始 json 的解决方案都可以工作。

标签: javascriptgoogle-apps-scriptgoogle-sheets-api

解决方案


这是一个有趣的概念,所以我搜索了一下并得到了一些工作。

在您的代码中,您必须使用compressedBlob.getBytes() 对未压缩的Blob.getDataAsString() 的数据进行编码。要在读取函数中创建 blob,您必须在输入中使用字节。

然后在您的读取函数中,解压缩返回一个数组,在获取数据之前,您必须使用 getAs() 函数。所以你必须 unzipped[0].getAs('application/octet-stream').getDataAsString() 而不是 unzipped.getDataAsString()

我做了一个函数来简化测试,所以你只需要根据需要拆分它。

function insertReadLargeJson(){
  var obj = {};
  obj["dummy"] = [];

  // Just to make the json huge
  for (var i = 0; i < 10000; i++)
  {
    obj["dummy"].push("value");
  }
  //    Logger.log(obj)

  var activeSheet = SpreadsheetApp.getActiveSheet();

  var str = JSON.stringify(obj);

  var blob = Utilities.newBlob(str, 'application/octet-stream');
  var compressedBlob = Utilities.zip([blob]);

  var encoded = Utilities.base64Encode(compressedBlob.getBytes());

  activeSheet.getRange(1, 1).setValue(encoded);

  var decoded = Utilities.base64Decode(encoded);

  var blob = Utilities.newBlob(decoded,'application/zip');

  var unzipped = Utilities.unzip(blob);

  var obj = JSON.parse(unzipped[0].getAs('application/octet-stream').getDataAsString());
  //    Logger.log(JSON.stringify(obj))
  Logger.log(obj.dummy.length)
  //    Logger.log('Test Json array size', "" + obj["dummy"].length)
}

推荐阅读