Powershell: выбор отдельных значений из ответа JSON - PullRequest
1 голос
/ 05 апреля 2019

Я тестирую код для отправки платежных данных в формате JSON, который работает, однако я изо всех сил пытаюсь извлечь информацию из ответа JSON. Мне нужно извлечь контентную часть ответа JSON как отдельные значения, чтобы я мог назначить их переменным, а затем вставить их в таблицу SQL.

Ответ присваивается $ Result. Я пробовал $ Result.content, хотя, очевидно, это дает вам весь раздел контента. Есть ли способ получить отдельные значения из контента, не переходя по маршруту подстроки?

Вот пример ответа:


    {"transaction":{"id":"83123b05-2435-40c9-851d-a5636f092637","processed_at":"2019-04-05T13:02:19.689188Z","transaction_type":"Debit","currency_code":"GBP","amount":25000,"recipient_id":"8a659242-8e70-47e1-85ca-2fe18cb262a0","status":"Waiting for funds","status_info":"Insufficient Funds To Process","reconciliation":null,"reference":"D000000516","account_id":"07b286ad-dabc-42a7-ab1b-5302fd382e6c","tag":null,"end_balance":null,"idempotent_key":"1f25e9f8-64cf-4e91-b4d3-8753437b6dbb","created_at":"2019-04-05T13:02:19Z","updated_at":"2019-04-05T13:02:19Z"}}

Вот мой код Powershell:

cls
$Uri = "uriaddress"
$Content = Get-content C:\Test\BACS-DC190326093019.TXT | select-object -skip 4 
foreach($line in $Content){
  if($line.Substring(0,1) -match "[0-9]")
  {
  $sorcode = $line.Substring(0,6)
  $sorcode 
  $accountNumber =   $line.Substring(6,8)
  $accountNumber

  $CustomerName = $line.Substring(82,18)
  $CustomerName

  $FundingAmount = $line.Substring(41,5)
  $FundingAmount = $FundingAmount 
  $FundingAmount

  $Identifier = $line.Substring(64,10)
  $idempotent_key = New-Guid

  $body = @{
    "account_id"     = "000000"
    "currency_code"  = "GBP"
    "amount"         = $FundingAmount
    "recipient_name" = $CustomerName
    "account_no"     = $accountNumber
    "sort_code"      = $sorcode
    "idempotent_key" = $idempotent_key
    "reference"      = $Identifier
    "legal_type"     = "PRIVATE"
    }

    $headers = @{}
    $headers.Add("Authorization","00000000")

    $Result = ''
    $Result = Invoke-WebRequest -Uri $Uri -ContentType 'multipart/form-data' -Method Post -Headers $headers -Body $body 

 $Result.Content

    IF ($Result.StatusDescription -eq 'OK') { 
       write-host "Payment Sent Succesfully" -ForegroundColor Green
    } ELSE {
       write-host "Payment Failed Succesfully" -ForegroundColor Red
    }

    write-host ""
  }
}

1 Ответ

5 голосов
/ 05 апреля 2019

PowerShell имеет встроенную поддержку для обработки JSON, поэтому давайте проведем ваш ввод через ConvertFrom-Json и посмотрим, что мы получим.

$Result = '{"transaction":{"id":"83123b05-2435-40c9-851d-a5636f092637","processed_at":"2019-04-05T13:02:19.689188Z","transaction_type":"Debit","currency_code":"GBP","amount":25000,"recipient_id":"8a659242-8e70-47e1-85ca-2fe18cb262a0","status":"Waiting for funds","status_info":"Insufficient Funds To Process","reconciliation":null,"reference":"D000000516","account_id":"07b286ad-dabc-42a7-ab1b-5302fd382e6c","tag":null,"end_balance":null,"idempotent_key":"1f25e9f8-64cf-4e91-b4d3-8753437b6dbb","created_at":"2019-04-05T13:02:19Z","updated_at":"2019-04-05T13:02:19Z"}}' 

$Result = $Result | Convertfrom-json

При использовании вы просто запустите последнюю часть, чтобы преобразовать $Result в объект PowerShell.

$Result имеет одно свойство с именем .transaction, в котором хранится вся информация. Мы можем получить это с помощью следующего синтаксиса.

$result.transaction


id               : 83123b05-2435-40c9-851d-a5636f092637
processed_at     : 2019-04-05T13:02:19.689188Z
transaction_type : Debit
currency_code    : GBP
amount           : 25000
recipient_id     : 8a659242-8e70-47e1-85ca-2fe18cb262a0
status           : Waiting for funds
status_info      : Insufficient Funds To Process
reconciliation   : 
reference        : D000000516
account_id       : 07b286ad-dabc-42a7-ab1b-5302fd382e6c
tag              : 
end_balance      : 
idempotent_key   : 1f25e9f8-64cf-4e91-b4d3-8753437b6dbb
created_at       : 2019-04-05T13:02:19Z
updated_at       : 2019-04-05T13:02:19Z

Итак, теперь, если мы хотим извлечь определенные значения оттуда, мы запустим следующее.

C:\Users\Stephen> $result.transaction.amount
25000

C:\Users\Stephen> $result.transaction.status
Waiting for funds

C:\Users\Stephen> "Transaction in the amount of $($result.transaction.amount) -- status: $($result.transaction.status)"
Transaction in the amount of 25000 -- status: Waiting for funds

Это должно помочь вам в этом.

Последний тидбит, если вы поменяете Invoke-WebRequest на Invoke-RestMethod, преобразование из JSON будет выполнено для вас автоматически!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...