Доступ к JSON цифре c значению свойства с powershell? - PullRequest
0 голосов
/ 13 января 2020

Я застрял, пытаясь определить правильный формат для чтения значений из JSON данных в powershell.

Ввод JSON

    {
    "last_time": "2020-01-13T16:39:37.000Z",
    "sensors": {
        "1929": [{
            "observed": "2020-01-13T16:38:39.000Z",
            "humidity": 26.26,
            "temperature": 66.55
        }],
        "2032": [{
            "observed": "2020-01-13T16:38:50.000Z",
            "humidity": 22.87,
            "temperature": 74.6
        }],
        "2198": [{
            "observed": "2020-01-13T16:39:37.000Z",
            "humidity": 31.14,
            "temperature": 62.79
        }]
    },
    "truncated": false,
    "status": "OK",
    "total_samples": 3,
    "total_sensors": 3
    }

Требуемый вывод

    <prtg><result><channel>2198 temperature</channel><value>62.79</value></result></prtg>

Я могу выполнить преобразование в XML очень хорошо, но я бился головой, пытаясь разобраться, как читать фактическое значение свойства в powershell, когда ключом является все число c в кавычках.

Я пробовал что-то вроде:

    write-Output $sp.sensors.2198[0].temperature

Как можно избежать 2198?

Ответы [ 3 ]

1 голос
/ 13 января 2020

Сделать строку

$sp.sensors."2198".temperature
0 голосов
/ 13 января 2020

Вот версия get-member. См. Также Перебор свойств PSObject в PowerShell

$Json = Get-Content file.json
$jsonObj = $Json | ConvertFrom-Json
$jsonObj.sensors | get-member -Type Properties | % name

1929
2032
2198
0 голосов
/ 13 января 2020

Поскольку ваше имя свойства представляет собой строку чисел, вам необходимо сначала присвоить значение целочисленного ключа, а затем получить доступ к значению этой переменной.

$newObj = $jsonObj.sensors.1929
$newObj.temperature

# Or Put Parenthesis around it.
($jsonObj.sensors.1929)[0].temperature

Вы можете использовать, PSObject.Properties для получить свойства и выполнить их итерацию.

$Json = Get-Content C:\temp\fileWithJsonData
$jsonObj = $Json | ConvertFrom-Json
$jsonObj.sensors.PSObject.Properties | % { $_.Name }

Вывод

1929
2032
2198

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

foreach($prop in $jsonObj.sensors.PSObject.Properties) 
{ 
    write-output "$($prop.Name) $($prop.value[0].observed) $($prop.value[0].humidity) $($prop.value[0].temperature)" 
}

Выход

 1929 2020-01-13T16:38:39.000Z 26.26 66.55
 2032 2020-01-13T16:38:50.000Z 22.87 74.6
 2198 2020-01-13T16:39:37.000Z 31.14 62.79
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...