Добавление метки времени в тело JSON

Я новичок в PowerShell и еще не привык. Я пытаюсь удалить некоторые из моих серверов в режиме реального времени. Для этого я использую RestAPI, который отправляет мне данные в формате JSON (который Powershell автоматически преобразует в PSCustomObject).

Дело в том, что в моем JSON / data API нет отметки времени поля, поэтому мне пришлось ее добавить. К сожалению, инструменты JSON в PowerShell кажутся ограниченными, и я не смог добавить их напрямую. Мне пришлось создать новый объект PSCustomObject с именем timestamp и объединить его с моими данными из API.

К сожалению, данные не анализируются правильно. Я просматриваю строку, массив строк, хеш-таблицу. Это было хуже всего. Наконец, я загрузил JSON.NET Framework, с которым сейчас пытаюсь работать ...

Итак, вот основная часть кода:

Function Combine-Objects { 
    Param (
        [Parameter(mandatory=$true)]$Object1, 
        [Parameter(mandatory=$true)]$Object2
    )

    $arguments = [Pscustomobject]@() 
    foreach ( $Property in $Object1.psobject.Properties){
        $arguments += @{$Property.Name = $Property.value}  
    }

    foreach ( $Property in $Object2.psobject.Properties){
        $arguments += @{ $Property.Name= $Property.value}         
    }

    $Object3 = [Pscustomobject]$arguments

    return $Object3
    }

while (1) 
{
    $startpoint = "REST API URL"
    $endpoint = "POWER BI API URL"
    $response = Invoke-RestMethod -Method Get -Uri $startpoint 
    $timestamp=get-date -format yyyy-MM-ddTHH:mm:ss.fffZ 
    $response2 = [PsCustomObject]@{"timestamp"=$timestamp}
    $response3 = Combine-Objects -Object1 $response -Object2 $response2
    Invoke-RestMethod -Method Post -Uri "$endpoint" -Body (ConvertTo-Json @($response3))
}

Перед объединением PSCustomObject у меня есть:

    total     : 8589463552
    available : 5146566656
    percent   : 40,1
    used      : 3442896896
    free      : 5146566656

который дал мне правильный JSON после его преобразования

    [
        {
            "total":  8589463552,
            "available":  5146566656,
            "percent":  40.1,
            "used":  3442896896,
            "free":  5146566656
        }
    ]

Хотя после объединения и добавления метки времени у меня есть:

    Name                           Value                                                                                                                                                           
    ----                           -----                                                                                                                                                           
    total                          8589463552                                                                                                                                                      
    available                      5146566656                                                                                                                                                      
    percent                        40,1                                                                                                                                                            
    used                           3442896896                                                                                                                                                      
    free                           5146566656                                                                                                                                                      
    timestamp                      2019-10-09T22:17:18.734Z    

Что дало мне после преобразования:

    [
        {
            "total":  8589463552
        },
        {
            "available":  5146566656
        },
        {
            "percent":  40.1
        },
        {
            "used":  3442896896
        },
        {
            "free":  5146566656
        },
        {
            "timestamp":  "2019-10-09T22:17:18.734Z"
        }
    ]

В то время как все, что я хотел, было просто:

    [
     {
      "total" :98.6,
      "available" :98.6,
      "percent" :98.6,
      "used" :98.6,
      "free" :98.6,
      "timestamp" :"2019-10-11T09:21:04.981Z"
     }
    ]

person Lord Djaz    schedule 11.10.2019    source источник
comment
$arguments = [Pscustomobject]@() - ›$arguments = @{} внутри вашей Combine-Objects функции   -  person Mathias R. Jessen    schedule 11.10.2019


Ответы (1)


Я думаю, ты неправильно смотришь на это. Почему бы просто не добавить NoteProperty, содержащий DateTime string, к PSCustomObject, а затем преобразовать его обратно в формат json?

Что-то вроде этого было бы достаточно:

$json = @"
 [
    {
         "total":  8589463552,
         "available":  5146566656,
         "percent":  40.1,
         "used":  3442896896,
         "free":  5146566656
     }
  ]
"@
$jsonConverted = $json | ConvertFrom-Json
    
$params = @{
   NotePropertyName  = 'timestamp'
   NotePropertyValue = (Get-Date).ToString('yyyy-MM-ddTHH:mm:ss.fff')
}
$jsonConverted | Add-Member @params
    
$newJson = $jsonConverted | ConvertTo-Json  
$newJson

В результате получится объект json, который вы ищете:

{
    "total":  8589463552,
    "available":  5146566656,
    "percent":  40.1,
    "used":  3442896896,
    "free":  5146566656,
    "timestamp":  "2019-10-11T13:33:05.673"
}
person DarkLite1    schedule 11.10.2019
comment
Привет, Darklite1, Спасибо большое! Я действительно думал о функции add-member, но меня смущали типы. Поэтому я считаю, что Powershell по умолчанию обрабатывает JSON как PSCustomObject. Несмотря на то, что у меня все еще есть проблема: { "total": 8589463552, ... "timestamp": "2019-10-11T13:33:05.673" } вместо [ { "total" :98.6, ... "timestamp" :"2019-10-11T09:21:04.981Z" }] - person Lord Djaz; 11.10.2019
comment
Это сработало, спасибо, чувак! Я просто добавил что-то вроде $output = "['n " + $outputTEMP + "'n]", чтобы получить правильный формат - person Lord Djaz; 11.10.2019
comment
Уф :) Чтобы добиться формата array объекта json, вам нужно использовать $NewJson = ConvertTo-Json @($JsonConverted) вместо $NewJson = $JsonConverted | ConvertTo-Json. Нашел ответ здесь. - person DarkLite1; 14.10.2019
comment
Идеально, определенно чище, чем мой обходной путь. Отлично ! - person Lord Djaz; 14.10.2019
comment
Символы [ .. ] указывают в json форматировании, что это array, означающий набор объектов или группу объектов. array в PowerShell обозначается как @( .. ). Рад, что смог помочь тебе. Продолжайте исследовать, чем больше вы играете с ним, тем лучше у вас будет :) - person DarkLite1; 14.10.2019
comment
Спасибо, это имеет большой смысл с объяснениями :) - person Lord Djaz; 14.10.2019