Azure Pipeline中JSON参数双引号转义及Python解析问题
解决Azure Pipeline模板传递JSON字符串参数的转义问题
核心问题根源
Azure Pipeline的YAML解析、Shell命令行参数传递都会对双引号、反斜杠做转义处理,导致JSON字符串丢失格式或解析失败。以下是几种直接可行的解决方法:
方法1:YAML单引号包裹+Shell双引号传递
这是最直接的常规解法,利用YAML单引号保留原始字符串,再通过Shell双引号避免参数被拆分。
步骤1:模板参数定义
将模板的accountvars设为string类型:
# your-template.yml parameters: - name: accountvars type: string default: '{}' steps: - bash: | # 用双引号包裹参数,确保Shell不解析内部引号 python your_script.py "${{ parameters.accountvars }}" displayName: 'Run Python Script with JSON'
步骤2:主流水线传递参数
用单引号包裹完整的JSON字符串,让YAML不解析内部的双引号:
# main-pipeline.yml steps: - template: your-template.yml parameters: accountvars: '{"username": "admin", "role": "editor"}'
步骤3:Python脚本解析
直接通过sys.argv接收参数并解析:
# your_script.py import json import sys if __name__ == "__main__": json_data = json.loads(sys.argv[1]) print(json_data["username"]) # 输出 admin
方法2:三重转义处理复杂场景
如果YAML或Shell对转义有特殊处理(比如嵌套模板、参数包含特殊字符),可以对JSON的双引号做三重转义:
主流水线传递参数
将JSON中的"替换为\\\",确保经过YAML和Shell两层转义后,最终传递给Python的是正确的双引号:
# main-pipeline.yml steps: - template: your-template.yml parameters: accountvars: "{\\\"username\\\": \\\"admin\\\", \\\"role\\\": \\\"editor\\\"}"
模板和Python脚本的写法和方法1一致,此时Python会收到完整的{"username": "admin", "role": "editor"}字符串。
方法3:Base64编码彻底规避转义
如果JSON包含大量特殊字符(比如换行、反斜杠),用Base64编码可以完全绕过转义问题:
步骤1:主流水线传递编码后的JSON
先把你的JSON字符串用Base64编码(可以用echo '{"key":"val"}' | base64生成):
# main-pipeline.yml steps: - template: your-template.yml parameters: accountvars: 'eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJyb2xlIjogImVkaXRvciJ9'
步骤2:模板中解码并传递
在bash任务中先解码,再传给Python:
# your-template.yml parameters: - name: accountvars type: string default: '' steps: - bash: | # 解码Base64字符串 json_str=$(echo "${{ parameters.accountvars }}" | base64 -d) # 传递给Python python your_script.py "$json_str" displayName: 'Decode Base64 and Run Script'
Python脚本的解析逻辑和方法1完全一致。
常见坑点规避
- 不要将模板参数设为
object类型:YAML会自动解析为对象,传递到Shell时会丢失引号和结构。 - Shell传递参数必须用双引号包裹:否则Shell会把JSON按空格拆分,导致参数不完整。
- 避免在JSON中直接使用YAML特殊字符(比如
:、-),如果必须用,优先用Base64方法。
内容的提问来源于stack exchange,提问作者gipcu
相关产品推荐
相关产品推荐

