如何使用PowerShell从DynamoDB返回的嵌套JSON中提取dataversions字段值
PowerShell 处理DynamoDB查询结果提取dataversions的实现方案
核心处理逻辑拆解
整个流程按顺序处理以下问题点,避开反复转义的常见坑:
- 直接从DynamoDB原生响应结构中剥离类型标签,拿到Tags字段的原始字符串值
- 还原嵌套JSON文本里的转义换行、转义引号,还原成可解析的有效JSON格式
- 清除所有字段名前后的多余空格,解决带空格键名无法匹配的问题
- 提取纯净的dataversions数组值,覆盖本地文件的对应字段
可直接运行的实现代码
# 1. 调用AWS CLI获取DynamoDB查询结果,直接转成PS对象,避免二次转义 $queryResult = aws dynamodb query ` --table-name 你的目标表名 ` --key-condition-expression "ReleaseId = :rid" ` --expression-attribute-values '{":rid": {"N": "1"}}' ` --output json | ConvertFrom-Json # 2. 剥离DynamoDB类型标签,拿到Tags字段的原始转义字符串 if ($queryResult.Items.Count -eq 0) { throw "未查询到ReleaseId为1的有效记录" } $rawTagsString = $queryResult.Items[0].Tags.S # 3. 还原嵌套JSON的转义字符,把被转义的\n、\"还原为实际可解析的JSON内容 $cleanTagsJson = $rawTagsString -replace '\\n', '' -replace '\\"', '"' # 转成PS对象 $tagsObject = $cleanTagsJson | ConvertFrom-Json # 4. 清理所有属性名前后的多余空格,重新生成无空格的干净对象 $cleanTagsObject = [PSCustomObject]@{} foreach ($prop in $tagsObject.PSObject.Properties) { $trimmedKey = $prop.Name.Trim() $cleanTagsObject | Add-Member -MemberType NoteProperty -Name $trimmedKey -Value $prop.Value } # 5. 提取dataversions数组值 if (-not $cleanTagsObject.PSObject.Properties.Name.Contains('dataversions')) { throw "Tags内未找到有效的dataversions字段" } $extractedDataVersions = $cleanTagsObject.dataversions # 6. 读取本地example.json,覆盖原有dataversions字段 $localConfig = Get-Content -Path "./example.json" -Raw | ConvertFrom-Json $localConfig.dataversions = $extractedDataVersions # 7. 写回本地文件,设置足够深度避免数组结构丢失 $localConfig | ConvertTo-Json -Depth 20 | Set-Content -Path "./example.json" -Encoding UTF8
关键避坑说明
- 不要对
Tags.S的原始字符串做多轮ConvertTo-Json/ConvertFrom-Json操作,会把原本的转义字符二次包裹,最终拿到的还是被多层字符串包裹的无效内容,是之前无法提取到数组值的核心原因 - 匹配带空格的字段名时,必须先对属性名做
Trim()处理,不能用精确字符串匹配查找,否则会漏掉dataversions这类前后带空格的键 - 写回本地JSON时必须指定足够大的
-Depth参数(建议20以上),否则嵌套数组会被PowerShell默认深度截断成字符串
内容的提问来源于stack exchange,提问作者YANS
相关产品推荐
相关产品推荐

