PowerShell:按字段值检索JSON对象

Bal*_*tar 49 powershell json powershell-3.0

考虑这种格式的JSON:

"Stuffs": [
    {
        "Name": "Darts",
        "Type": "Fun Stuff"
    },
    {
        "Name": "Clean Toilet",
        "Type": "Boring Stuff"
    }
]
Run Code Online (Sandbox Code Playgroud)

在PowerShell 3中,我们可以获得一个Stuffs列表:

$JSON = Get-Content $jsonConfigFile | Out-String | ConvertFrom-Json
Run Code Online (Sandbox Code Playgroud)

假设我们不知道列表的确切内容,包括对象的排序,我们如何检索具有Name字段的特定值的对象?

蛮力,我们可以遍历列表:

foreach( $Stuff in $JSON.Stuffs ) { 
Run Code Online (Sandbox Code Playgroud)

但我希望存在一种更直接的机制(类似于C#中的Lync或Lambda表达式).

Dav*_*ant 69

$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
Run Code Online (Sandbox Code Playgroud)

  • $ x.Stuffs | 其中{$ _.姓名-eq"飞镖"} (12认同)

Xer*_*ero 27

我刚才在这里问了同样的问题: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"
}
Run Code Online (Sandbox Code Playgroud)

码:

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

$json.psobject.properties.name
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

感谢mjolinor.


小智 15

大卫布拉班特的回答让我得到了我需要的东西,加上这个:

x.Stuffs | where { $_.Name -eq "Darts" } | Select -ExpandProperty Type
Run Code Online (Sandbox Code Playgroud)


and*_*ate 5

这个怎么样:

$json=Get-Content -Raw -Path 'my.json' | Out-String | ConvertFrom-Json
$foo="TheVariableYourUsingToSelectSomething"
$json.SomePathYouKnow.psobject.properties.Where({$_.name -eq $foo}).value
Run Code Online (Sandbox Code Playgroud)

这将从 json 结构中选择

{"SomePathYouKnow":{"TheVariableYourUsingToSelectSomething": "Tada!"}
Run Code Online (Sandbox Code Playgroud)

这是基于powershell SO question 中的这个访问值 。是不是 powershell 太棒了!