首页 > 解决方案 > 如何将变量传递到转义的 json 字符串中?

问题描述

我正在尝试将 json 传递给 REST api 调用,以便开始在 VSTS 上构建。

正文有两个作为转义字符串传入的参数,我在调用我的请求之前努力更新参数。我的身体的一个例子如下:

$body ='
{
    "definition":
    {
        "id": ""
    },
    "parameters": "{\"environment\":\"uat\", \"browser\":  \"ie\"}"
}
'

这被传递到以下我成功更新定义ID的地方:

$bodyJson=$body | ConvertFrom-Json
$bodyjson.definition.id = $buildDefId
$bodyString=$bodyJson | ConvertTo-Json -Depth 100

这工作成功,但我无法访问 json 的参数元素,以便将浏览器和环境作为变量传递。

你对如何做到这一点有什么建议吗?

我尝试了以下方法但没有成功:

$params = $bodyJson.Paramaters
$params -replace "uat","test"
$bodyString=$bodyJson | ConvertTo-Json -Depth 100

这会更新参数,$params但在转换时不会将其传递回 json。我觉得我很接近但显然错过了一步。

标签: jsonpowershellazure-devops-rest-api

解决方案


显然,您parameters在另一个 Json 字符串中嵌入了一个 Json ( ) 字符串。这意味着您必须ConvertFrom-Json两次反序列化所有内容,并ConvertTo-Json使用新参数将其序列化两次:(
请注意,我交换了变量名称$body$bodyJson因为$body它是一个对象,$bodyJson实际上是您的 Json 字符串)

$bodyJson = '
{
    "definition": {
        "id": ""
    },
    "parameters": "{\"environment\":\"uat\", \"browser\":  \"ie\"}"
}
'
$body = $bodyJson | ConvertFrom - Json
$paramJson = $body.parameters
$parameters = $paramJson | ConvertFrom - Json
$parameters

environment browser
----------- -------
uat         ie 

更改参数:

$parameters.environment = "test"

并重建 Json 字符串:

$paramJson = $parameters | ConvertTo-Json -Compress
$body.parameters = $paramJson
$bodyJson = $body | ConvertTo-Json
$bodyJson
{
    "definition":  {
                       "id":  ""
                   },
    "parameters":  "{\"environment\":\"test\",\"browser\":\"ie\"}"
}

推荐阅读