Shell解析多模块JSON避免变量覆盖,生成组合值的方法
问题:解析多模块JSON并生成每个模块的组合值
我已掌握解析含空格的单结构JSON的方法,但遇到新问题:存在多个结构相同但值不同的JSON模块时,最后一个模块的值会覆盖之前的,需要输出每个模块中WorkspaceName和ReportFileName的组合值。
测试用JSON示例
{ "WorkspaceName":"aaa bbb ccc ddd eee", "ReportFileName":"xxx yyy zzz", "StageName":"sit uat prod" }, { "WorkspaceName":"1111 2222 3333 4444 5555", "ReportFileName":"6666 7777 8888", "StageName":"sit1 uat1 prod1" }
注意:上述JSON需包裹在数组[]中才符合标准格式,否则无法被专业工具正常解析,修正后应为:
[ { "WorkspaceName":"aaa bbb ccc ddd eee", "ReportFileName":"xxx yyy zzz", "StageName":"sit uat prod" }, { "WorkspaceName":"1111 2222 3333 4444 5555", "ReportFileName":"6666 7777 8888", "StageName":"sit1 uat1 prod1" } ]
尝试的Shell脚本(main.sh)
InitialFile=$WORKSPACE/deployment/configuration/Initial.json eval $(sed -n -e 's/^.*"\(.*\)":\(".*"\).*$/\1=\2/p' $InitialFile) ConfigFile="$WorkspaceName"_"$ReportFileName" echo The Config File is_$ConfigFile
当前结果与期望结果
- 当前结果:仅输出最后一个模块的组合值
The Config File is_1111 2222 3333 4444 5555_6666 7777 8888 - 期望结果:输出所有模块的组合值
The Config File is_aaa bbb ccc ddd eee_xxx yyy zzz The Config File is_1111 2222 3333 4444 5555_6666 7777 8888
解决方案
使用jq工具(专门的JSON处理工具,Jenkins环境通常可通过插件或全局工具配置添加)来遍历每个JSON对象并提取所需字段,避免eval和sed处理JSON的局限性。
修正后的main.sh脚本:
InitialFile="$WORKSPACE/deployment/configuration/Initial.json" # 遍历每个JSON对象,直接输出拼接后的结果 jq -r '.[] | "The Config File is_\(.WorkspaceName)_\(.ReportFileName)"' "$InitialFile" # 若需将结果保存为变量供后续测试使用,可按如下方式: # 读取所有组合值到数组 readarray -t config_files < <(jq -r '.[] | "\(.WorkspaceName)_\(.ReportFileName)"' "$InitialFile") # 遍历数组执行后续测试逻辑 for file in "${config_files[@]}"; do echo "Processing config file: $file" # 此处添加你的测试操作 done
脚本说明
- 修正JSON格式:确保原始JSON包裹在数组
[]中,这是多对象JSON的标准结构,也是jq能正确遍历的前提。 - jq命令解析:
.[]:遍历数组中的每个JSON对象"\(.WorkspaceName)_\(.ReportFileName)":提取指定字段并拼接成所需格式-r:输出原始字符串(不带JSON默认的引号)
- 变量保存:使用
readarray将所有组合值存入数组,方便后续测试流程中逐个调用。
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

