如何使用JSON.parse()解析含嵌套JSON字符串属性的JSON数据
问题描述
我正在尝试解析来自 aws secretsmanager 的响应。
接口返回的输出结构如下:
{ "ARN": "arn:aws:secretsmanager:us-west-2:0000:secret:token-0000", "Name": "token", "VersionId": "0000-0000-0000-0000-0000", "SecretString": "{\"TOKEN\":\"000000000000\"}", "VersionStages": ["AWSCURRENT"], "CreatedDate": "0000" }
尝试使用 JSON.parse() 解析该字符串时,程序会处理 SecretString 字段中携带转义引号的字符串值。原本预期分两步对响应执行 JSON.parse 即可完成解析,但该方案无法正常生效,使用的脚本代码如下:
#!/bin/bash TOKEN=$(node -e "\ const result = JSON.parse('$(aws secretsmanager get-secret-value --secret-id $ARN)'); \ const token = JSON.parse(result.SecretString); \ console.log(token); \ ") echo $TOKEN
待解决疑问:
- 如何阻止
JSON.parse函数尝试解析SecretString的字符串值? - 是否存在更优的方式来获取目标字段值?
解决方案
问题根因
脚本失效和JSON.parse的默认行为无关。第一次调用JSON.parse解析接口整体响应时,本就只会将SecretString识别为普通字符串类型,不会自动解析其内部的JSON结构。
报错的核心原因是采用shell字符串拼接的方式把AWS返回结果直接嵌入Node.js执行代码,返回内容里的转义引号、换行符会直接破坏JS字符串的语法结构,导致第一层JSON.parse就执行失败。
另外SecretString本身就是Secrets Manager服务返回的、被序列化为字符串的JSON文本,不存在“阻止JSON.parse解析它”的需求,要拿到内部字段,二次解析是符合接口设计的正确逻辑。
方案1:修正双解析逻辑(兼容无额外工具的环境)
不要通过字符串拼接传递接口返回结果,改用标准输入流把AWS CLI的输出传给Node.js,从根源避免shell转义冲突:
#!/bin/bash TOKEN=$(aws secretsmanager get-secret-value --secret-id "$ARN" | node -e " let rawData = ''; process.stdin.on('data', chunk => rawData += chunk); process.stdin.on('end', () => { const resp = JSON.parse(rawData); const secret = JSON.parse(resp.SecretString); console.log(secret.TOKEN); }); ") echo "$TOKEN"
方案2:使用CLI原生能力解析(最优实践)
不需要依赖Node.js做中转,直接结合AWS CLI自带的查询参数和jq工具即可一步提取目标值,是生产环境最常用的实现方式,转义问题最少:
#!/bin/bash TOKEN=$(aws secretsmanager get-secret-value \ --secret-id "$ARN" \ --query 'SecretString' \ --output text | jq -r '.TOKEN') echo "$TOKEN"
注意:shell脚本中引用变量时建议添加双引号包裹,避免内容包含特殊字符引发执行异常。
内容的提问来源于stack exchange,提问作者David Alsh
相关产品推荐
相关产品推荐

