如何将变量传递到转义的json字符串中?

时间:2018-07-09 14:26:30

标签: json powershell azure-devops-rest-api

我试图将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的parameters元素,以将浏览器和环境作为变量传递。

您对此有任何建议吗?

我尝试了以下操作但未成功:

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

这将更新$params中的参数,但在转换时不会将其传递回json。我觉得我已经接近了,但显然缺少一步。

1 个答案:

答案 0 :(得分:3)

显然,您在另一个Json字符串中嵌入了一个Json(parameters)字符串。 这意味着您必须两次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\"}"
}