2013-05-15 10 views
25

Rozważmy JSON w tym formacie:PowerShell: odzyskać obiekt JSON przez wartość pola

"Stuffs": [ 
    { 
     "Name": "Darts", 
     "Type": "Fun Stuff" 
    }, 
    { 
     "Name": "Clean Toilet", 
     "Type": "Boring Stuff" 
    } 
] 

W PowerShell 3, możemy uzyskać listę Stuffs:

$JSON = Get-Content $jsonConfigFile | Out-String | ConvertFrom-Json 

Zakładając, że nie wiem dokładna zawartość listy, w tym kolejność obiektów, w jaki sposób możemy pobrać obiekt (y) o określonej wartości dla pola Nazwa?

Brutalna siła, możemy wykonać iterację listy:

foreach($Stuff in $JSON.Stuffs) { 

Ale mam nadzieję, istnieje bardziej bezpośredni mechanizm (podobny do Lync lub wyrażeń lambda w C#).

Odpowiedz

30
$json = @" 
{ 
"Stuffs": 
    [ 
     { 
      "Name": "Darts", 
      "Type": "Fun Stuff" 
     }, 

     { 
      "Name": "Clean Toilet", 
      "Type": "Boring Stuff" 
     } 
    ] 
} 
"@ 

$x = $json | ConvertFrom-Json 

$x.Stuffs[0] # access to Darts 
$x.Stuffs[1] # access to Clean Toilet 
$darts = $x.Stuffs | where { $_.Name -eq "Darts" } #Darts 
+0

Dzięki Dawida. Zmieniłem moje pytanie, aby było bardziej jasne. Twoja odpowiedź nie zadziała, ponieważ kod nie będzie wiedział z góry, jak zbudowany jest JSON. Możliwe, że rzutki znajdują się w gnieździe 0 i Czysta toaleta w gnieździe 1, ale może też być tak, że Czysta toaleta jest w gnieździe 0, a Rzutka jest w gnieździe 1. Dlatego potrzebuję jakiegoś sposobu dopasowania obiektów w polu Nazwa. – BaltoStar

+9

$ x.Stuffs | gdzie {$ _. Nazwa -eq "Rzutki"} –

20

Właśnie to samo pytanie tutaj: https://stackoverflow.com/a/23062370/3532136 Ma dobre rozwiązanie. Mam nadzieję, że to pomoże ^^. W CV, można użyć tego:

Plik Json w moim przypadku był nazywany jsonfile.json:

{ 
    "CARD_MODEL_TITLE": "OWNER'S MANUAL", 
    "CARD_MODEL_SUBTITLE": "Configure your download", 
    "CARD_MODEL_SELECT": "Select Model", 
    "CARD_LANG_TITLE": "Select Language", 
    "CARD_LANG_DEVICE_LANG": "Your device", 
    "CARD_YEAR_TITLE": "Select Model Year", 
    "CARD_YEAR_LATEST": "(Latest)", 
    "STEPS_MODEL": "Model", 
    "STEPS_LANGUAGE": "Language", 
    "STEPS_YEAR": "Model Year", 
    "BUTTON_BACK": "Back", 
    "BUTTON_NEXT": "Next", 
    "BUTTON_CLOSE": "Close" 
} 

Kod:

$json = (Get-Content "jsonfile.json" -Raw) | ConvertFrom-Json 

$json.psobject.properties.name 

wyjściowa:

CARD_MODEL_TITLE 
CARD_MODEL_SUBTITLE 
CARD_MODEL_SELECT 
CARD_LANG_TITLE 
CARD_LANG_DEVICE_LANG 
CARD_YEAR_TITLE 
CARD_YEAR_LATEST 
STEPS_MODEL 
STEPS_LANGUAGE 
STEPS_YEAR 
BUTTON_BACK 
BUTTON_NEXT 
BUTTON_CLOSE 

Dzięki mjolinor. Odpowiedź

8

Davida Brabant doprowadziły mnie do tego, co potrzebne, z tym dodatkowo:

x.Stuffs | where { $_.Name -eq "Darts" } | Select -ExpandProperty Type