2013-05-15 75 views
25

考慮JSON格式如下:的PowerShell:通過字段值檢索JSON對象

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

在PowerShell中3,我們可以得到的東西的清單:

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

假設我們不知道列表的確切內容(包括對象的排序),我們如何檢索名稱字段具有特定值的對象?

蠻力,我們可以遍歷列表:

foreach($Stuff in $JSON.Stuffs) { 

但我希望存在一個更直接的機制(在C#相似到Lync或Lambda表達式)。

回答

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

感謝大衛。我已經修改我的問題更加清楚。您的答案將無法正常工作,因爲代碼不會提前知道JSON的結構。可能是飛鏢插槽0和插槽1的乾淨衛生間,但也可能是乾淨衛生間插槽0和飛鏢插槽1中。因此,我需要一些方法來匹配名稱字段上的對象。 – BaltoStar

+9

$ x.Stuffs |其中{$ _。Name -eq「Darts」} –

20

我剛纔問了同樣的問題在這裏:https://stackoverflow.com/a/23062370/3532136 它有一個很好的解決方案。我希望它可以幫助^^。 在簡歷中,您可以使用此:

在我的情況JSON文件被稱爲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" 
} 

代碼:

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

$json.psobject.properties.name 

輸出:

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 

感謝mjolinor

8

大衛·布拉班特的回答使我對我所需要的,但增加了:

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