Получить значение в объекте JSON из внешнего URI - PullRequest
2 голосов
/ 24 июня 2019

В моем коде PowerShell у меня есть:

$retrieveSourceBranchFromBuildURL = "https://dev.azure.com/$organization/$project/_apis/build/builds/$buildId" + "?api-version=5.0"

Когда я перехожу по URL-адресу в браузере, я вижу:

{
    _links: {
    self: {
    href: "https://dev.azure.com/something/7720f8d2-bf64-47d9-8b10-53f21220d54d/_apis/build/Builds/46070"
    },
    web: {
    href: "https://dev.azure.com/something/7720f8d2-bf64-47d9-8b10-53f21220d54d/_build/results?buildId=46070"
    },
    sourceVersionDisplayUri: {
    href: "https://dev.azure.com/something/7720f8d2-bf64-47d9-8b10-53f21220d54d/_apis/build/builds/46070/sources"
    },
    timeline: {
    href: "https://dev.azure.com/something/7720f8d2-bf64-47d9-8b10-53f21220d54d/_apis/build/builds/46070/Timeline"
    },
    badge: {
    href: "https://dev.azure.com/something/7720f8d2-bf64-47d9-8b10-53f21220d54d/_apis/build/status/67"
    }
    },
    parameters: "{"system.pullRequest.pullRequestId":"5766","system.pullRequest.sourceBranch":"refs/heads/pb/31333-test-branch/name","system.pullRequest.targetBranch":"refs/heads/master","system.pullRequest.sourceCommitId":"1cf19b95a59478a8554c2c03d65dcefe203529a6","system.pullRequest.sourceRepositoryUri":"https://something@dev.azure.com/something/something%20Suite/_git/client-web","system.pullRequest.pullRequestIteration":"1"}",
}  

Переменная $buildInformation:

$buildInformation = Invoke-RestMethod -Uri $retrieveSourceBranchFromBuildURL -Headers @{Authorization = $pat } -Method Get -ContentType 'application/json'

При выводе значения $buildInformation я получаю:

 @{_links=; properties=; tags=System.Object[]; validationResults=System.Object[]; plans=System.Object[]; triggerInfo=; id=46079; buildNumber=20190624.3; status=completed; result=succeeded; queueTime=2019-06-24T07:57:05.7271255Z; startTime=2019-06-24T07:57:12.8021227Z; finishTime=2019-06-24T08:12:27.003113Z; url=https://dev.azure.com/embrace/7720f8d2-bf64-47d9-8b10-53f21220d54d/_apis/build/Builds/46079; definition=; buildNumberRevision=3; project=; uri=vstfs:///Build/Build/46079; sourceBranch=refs/pull/5740/merge; sourceVersion=735f7a813c343dbbca5e1d1b3e966e0bad1db762; priority=normal; reason=pullRequest; requestedFor=; requestedBy=; lastChangedDate=2019-06-24T08:14:41.11Z; lastChangedBy=; parameters={"system.pullRequest.pullRequestId":"5740","system.pullRequest.sourceBranch":"refs/heads/master-md/social-create-team","system.pullRequest.targetBranch":"refs/heads/master","system.pullRequest.sourceCommitId":"e744e5c35bc3fd1539d5c49daa29147f048f3276","system.pullRequest.sourceRepositoryUri":"https://embrace@dev.azure.com/embrace/Embrace%20Suite/_git/client-web","system.pullRequest.pullRequestIteration":"5"}; orchestrationPlan=; logs=; repository=; keepForever=False; retainedByRelease=True; 

При выводе значения $buildInformation.parameters:

Write-Host $buildInformation.parameters

{
    "system.pullRequest.pullRequestId":"5740",
    "system.pullRequest.sourceBranch":"refs/heads/master-md/social-create-team",
    "system.pullRequest.targetBranch":"refs/heads/master",
    "system.pullRequest.sourceCommitId":"e744e5c35bc3fd1539d5c49daa29147f048f3276",
    "system.pullRequest.sourceRepositoryUri":"https://embrace@dev.azure.com/embrace/Embrace%20Suite/_git/client-web",
    "system.pullRequest.pullRequestIteration":"5"
}

Но когда я пытаюсь прочитать значение:

Write-Host $buildInformation.parameters.system.pullRequest.sourceBranch

Вывод пуст.

Так как мне получить значение parameters.system.pullRequest.sourceBranch?

1 Ответ

4 голосов
/ 24 июня 2019

Чтобы получить доступ к свойству со специальными символами в его имени, заключите имя параметра в кавычки следующим образом:

$buildInformation.parameters.'system.pullRequest.sourceBranch'

ПРИМЕЧАНИЕ : хитрость в том, что значениеparameters внутри двойных кавычек.Поэтому вы не сможете получить доступ к свойствам в parameters обычным способом.Чтобы обойти это, вы можете сделать преобразование непосредственно в parameters:

$convertedParams = $buildInformation.parameters | ConvertFrom-Json

# Access desired property
$convertedParams.'system.pullRequest.sourceBranch'

Когда вы обращаетесь к свойству, как вы пытались

$buildInformation.parameters.system.pullRequest.sourceBranch

, структура вашего JSON должнабыть таким:

PS> $buildInformation = '{
"parameters": {
  "system": {
    "pullRequest":{
      "sourceBranch": "refs/heads/master-md/social-create-team"
      }
    }
  }
}' | ConvertFrom-Json

# Checking output
PS> $buildInformation.parameters.system.pullRequest.sourceBranch
refs/heads/master-md/social-create-team
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...