JavaScript字符串转对象后无法通过点符号访问属性问题排查
问题原因与解决方案
核心问题
你的authObj实际上是数组类型,而非你期望的配置对象。虽然typeof authObj返回object(数组在JS里属于object类型),但数组没有JWT属性,所以用authObj.JWT访问会报错。
为什么会变成数组?
auth.comment.match(regex)使用了g全局修饰符,返回的是所有匹配结果的字符串数组。即使你的备注里只有一个配置对象,返回的也是长度为1的数组(比如["{...配置内容...}"])。- 你后续执行
JSON.parse(JSON.stringify(auth.comment.match(regex))),本质是把数组转成JSON字符串再解析回来,得到的还是数组,不是目标对象。
修正代码
var auth = nms.extAccount.load(39010); // 匹配完整的对象字面量,替换原正则避免截断问题 var regex = /{[\s\S]*}/; var matchResult = auth.comment.match(regex); if (matchResult) { // 取第一个匹配到的字符串,直接解析为对象 var authObj = JSON.parse(matchResult[0]); logInfo(authObj.JWT.endpoint); // 现在可以正常访问属性 } else { logInfo("未从备注中匹配到配置对象"); }
额外说明
- 原正则
/{([^;]*)}/gm存在隐患:[^;]*会在遇到分号时停止匹配,如果后续配置里出现分号,会导致解析不完整。改用{[\s\S]*}可以匹配所有字符(包括换行),确保完整捕获整个对象。 - 如果你的备注里只有这一段配置,也可以去掉正则,直接用
JSON.parse(auth.comment.trim())(前提是备注里没有其他多余内容)。
内容的提问来源于stack exchange,提问作者David Garcia
相关产品推荐
相关产品推荐

