AWS Lambda读取S3数据后无法访问对象键值对问题求助
问题解决方案
核心排查方向
- 代码中JSON.parse入参不符合规范:
JSON.parse()要求入参为标准JSON格式字符串,你先将string类型的原始返回值用new Object()转为字符串包装对象再传入parse方法,虽然多数场景下会隐式转换回原字符串,但如果原字符串本身存在格式问题会放大异常,这一步属于多余操作可以直接删除。 - S3读取的原始字符串存在不可见字符或格式异常,这是概率最高的问题:
- 字符串开头带UTF-8 BOM标记(\ufeff),JSON.parse不会自动处理该标记,会导致解析后的对象键名前附带不可见字符,用正常键名访问自然返回undefined
- 原始数据是JSON数组格式(外层包裹[]),解析后拿到的是数组而非单个对象,直接访问数组的name等属性必然返回undefined
- 原始数据是JSON Lines格式(每行一个独立JSON对象,无外层[]包裹),直接整串解析会失败,或解析出的结构完全不符合预期
- Mockaroo导出的键名前后附带空格、换行、零宽空格等不可见字符,比如键名实际是
" middlename"而非"middlename"
- Lambda日志的截断、格式差异不会影响实际对象的内存结构,不需要在这个方向浪费时间。
可直接运行的排查代码
将原有校验逻辑替换为下方代码,运行后的打印结果可以直接定位问题:
async function rdsWrite(objectRead) { // 打印原始字符串前10个字符的Unicode编码,确认是否存在BOM或不可见前缀 console.log("原始字符串前10字符编码:", [...objectRead.slice(0,10)].map(c => c.charCodeAt(0).toString(16)).join(' ')); let personObj; try { // 先去除首尾空白和BOM标记再解析 const cleanStr = objectRead.trim().replace(/^\ufeff/, ''); personObj = JSON.parse(cleanStr); } catch (e) { console.error("JSON解析失败:", e.message); return; } // 打印解析后变量的实际类型和所有键名 console.log("解析后类型:", Array.isArray(personObj) ? "数组" : typeof personObj); console.log("所有键名/元素:", JSON.stringify(Object.keys(personObj), null, 2)); // 如果是数组则打印第一个元素的键名 if (Array.isArray(personObj)) { console.log("第一个元素的键:", JSON.stringify(Object.keys(personObj[0] || {}), null, 2)); } }
对应修复方案
- 若排查发现解析结果为数组:取对应下标的元素后再访问键即可,比如
personObj[0].middlename - 若排查发现键名存在前缀/空格:要么访问时携带对应字符,要么解析后批量处理键名去除不可见字符
- 若为JSON Lines格式:按换行符分割原始字符串后逐行解析即可
内容的提问来源于stack exchange,提问作者Tex Evans
相关产品推荐
相关产品推荐

