javascript - 如何从 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 的解决方案都可以工作。
解决方案
这是一个有趣的概念,所以我搜索了一下并得到了一些工作。
在您的代码中,您必须使用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)
}
推荐阅读
- r - R中的循环纬度分箱
- node.js - 事件 on.('event'.... 从未触发,为什么?
- swift - Swift NSImageView 翻页效果
- angular - Angular [scrollTop] 导致不需要的行为
- css - 我可以删除 Buefy-Bulma 布局组件中的填充吗?
- c - 在堆栈和堆上分配内存的 Eratosthenes 筛的内存错误
- sql-server - 使用 CTE 进行递归查询所需的帮助/建议
- c# - 如何从继承的 FromBody 模型中获得正确的类型?
- javascript - 我可以使用 fs 中的 createReadStream() 和 base64 图像而不是路径吗?
- ag-grid - Ag-Grid:使用 css 添加列标题图标,破坏排序功能