如何从Amplify获取的S3对象中提取JSON数据?
解决Amplify S3下载JSON时Uint8Array解析问题
嘿,我懂你碰到的这个麻烦!直接处理Uint8Array确实容易踩坑——问题根源在于你没把二进制字节数组正确解码成UTF-8格式的字符串,直接用toString()或者JSON.parse()自然会失败。
正确处理步骤
当你通过Storage.get并设置download: true获取对象时,返回的Body是二进制字节数组(Uint8Array),必须先把它解码成JSON格式的字符串,再解析成可访问的JSON对象。这里推荐用现代浏览器都支持的TextDecoder API,它能精准处理UTF-8编码的字节:
修改后的代码示例
export function amplify() { let key = "68a92d44-f25a-4bd8-9543-cc95369ae9a0"; return Storage.get(key + ".json", { download: true }) .then(function(result) { // 初始化UTF-8解码器 const textDecoder = new TextDecoder('utf-8'); // 将Uint8Array解码为JSON字符串 const jsonString = textDecoder.decode(result.Body); // 解析字符串为可操作的JSON对象 const jsonData = JSON.parse(jsonString); // 现在就能正常访问name、meta等属性了 console.log('name属性值:', jsonData.name); console.log('meta属性值:', jsonData.meta); return jsonData; }) .catch(err => console.error('获取或解析数据失败:', err)); }
为啥之前的方法行不通?
- 直接调用
result.Body.toString():Uint8Array的默认toString()方法不会把字节转换成可读字符串,只会返回"[object Uint8Array]"或者乱码,自然无法解析成JSON。 - 直接
JSON.parse(result.Body):JSON.parse要求输入是字符串,传入字节数组会被强制转换成上面的无效字符串,所以会抛出解析错误。
备选兼容方案(适配旧环境)
如果需要兼容不支持TextDecoder的旧浏览器,可以用Blob+FileReader组合处理:
export function amplify() { let key = "68a92d44-f25a-4bd8-9543-cc95369ae9a0"; return Storage.get(key + ".json", { download: true }) .then(function(result) { return new Promise((resolve, reject) => { const blob = new Blob([result.Body], { type: 'application/json' }); const reader = new FileReader(); reader.onload = () => { const jsonData = JSON.parse(reader.result); resolve(jsonData); }; reader.onerror = reject; reader.readAsText(blob); }); }) .catch(err => console.error('获取或解析数据失败:', err)); }
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

