You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 11:27:15