【问题标题】:How to pass variables into an escaped json string?如何将变量传递到转义的 json 字符串中?
【发布时间】:2018-12-17 06:36:56
【问题描述】:

我正在尝试将 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。我觉得我很接近但显然错过了一步。

【问题讨论】:

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


    【解决方案1】:

    显然,您在另一个 Json 字符串中嵌入了一个 Json (parameters) 字符串。 这意味着您必须 ConvertFrom-Json 两次反序列化所有内容,并 ConvertTo-Json 两次以使用新参数将其序列化回:
    (请注意,我交换了变量名 $body$bodyJson 因为@987654326 @ 是一个对象,$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\"}"
    }
    

    【讨论】:

    • 哇——没想到会这样!不过效果很好,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多