/ / Ottieni valori da JSON con Powershell - json, powershell

Ottieni valori da JSON con Powershell - json, powershell

Domanda molto principiante. Sto cercando di ottenere determinati valori da JSON con Powershell. In particolare, voglio elencare i servizi: TEST00000 e FALSO solo.

Quando eseguo lo script di seguito, ottengo questo:

TEST00000                                                    FAKE
---------                                                    ----
@{Enabled=True; Processed=2; Sent=3; Failed=4; Downloaded=5} @{Enabled=True}

Come posso ottenere un elenco di solo i servizi?

Ancora più importante, come faccio a elencare solo i servizi che hanno la chiave / valore Enabled = True presente dentro di loro?

Ecco il codice:

$JSON = "{
"Envs": {
"DEV": {
"Services": {
"TEST00000": {
"Enabled": true,
"Processed": 2,
"Sent": 3,
"Failed": 4,
"Downloaded": 5
},
"FAKE": {
"Enabled": true
}
}
}
},
"Component": {
"Digger": {
"Envs": {
"DEV": {
"DownloadE": 4
}
}
}
}
}"

$jsonobj = ConvertFrom-Json -inputObject $JSON

$jsonobj.Envs.DEV.Services

risposte:

3 per risposta № 1

Per ottenere il nome di ciascuno Services proprietà. Puoi usare Get-Member come user2734259 ha fatto o è possibile utilizzare il psobject proprietà che memorizza informazioni utili su un oggetto.

$ServiceNames = $jsonobj.Envs.DEV.Services.psobject.properties.name

Una volta che hai i nomi puoi passarli sopra e filtrarli sulla proprietà secondaria Enabled

$jsonobj.Envs.DEV.Services.psobject.properties.name | ForEach-Object {
$_ | Where-Object {$jsonobj.Envs.DEV.Services.$_.Enabled -eq $True}
}

1 per risposta № 2

Questo dovrebbe consentire di ottenere i nomi dinamicamente, indipendentemente dal nome del servizio nel tuo JSON:

$JSON = "{
"Envs": {
"DEV": {
"Services": {
"TEST00000": {
"Enabled": true,
"Processed": 2,
"Sent": 3,
"Failed": 4,
"Downloaded": 5
},
"FAKE": {
"Enabled": true
}
}
}
},
"Component": {
"Digger": {
"Envs": {
"DEV": {
"DownloadE": 4
}
}
}
}
}"

$jsonobj = ConvertFrom-Json -inputObject $JSON
$enabledServices = $NULL
$disabledServices = $NULL

# Since the service names are arbitrary
# create an object that contains only
# objects whose MemberType is NoteProperty

$strServiceNames = @($($jsonobj.Envs.DEV.Services | Get-Member | Where { $_.MemberType -eq "NoteProperty" } | Select Name).Name)
$pscoServiceNames = [PSCustomObject]@{Names=$strServiceNames}
foreach($serviceName in $pscoserviceNames.Names)
{
# dynamically access the service name
# from $jsonobj.Envs.DEV.Services

$serviceStatus = $jsonobj.Envs.DEV.Services.$serviceName.Enabled

# parse results based on value of .Enabled

if($serviceStatus.ToString() -eq "True")
{
$enabledServices = [Array]$enabledServices + [PSCustomObject]@{Name = $serviceName;Enabled = $serviceStatus}
}
else
{
$disabledServices = [Array]$disabledServices + [PSCustomObject]@{Name = $serviceName;Enabled = $serviceStatus}
}
}

# Show the results

Write-Output "`nEnabled Services`n"
$enabledServices | Format-List
Write-Output "`nDisabled Services`n"
$disabledServices | Format-List

Se qualcosa non è chiaro fammelo sapere e posso spiegarlo in modo più dettagliato Spero che questo ti aiuti. Felice "bombardamento!