81

考虑这种格式的 JSON:

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

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

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

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

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

foreach( $Stuff in $JSON.Stuffs ) { 

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

4

6 回答 6

113
$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
于 2013-05-16T06:57:47.207 回答
39

我刚刚在这里问了同样的问题: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

于 2014-04-16T12:28:40.917 回答
22

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

x.Stuffs | where { $_.Name -eq "Darts" } | Select -ExpandProperty Type
于 2016-03-12T00:10:49.223 回答
6

这个怎么样:

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

将从 json 结构化中选择

{"SomePathYouKnow":{"TheVariableYourUsingToSelectSomething": "Tada!"}

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

于 2019-09-25T16:02:29.090 回答
2

关于 PowerShell 5.1(这在 PowerShell 7 中要容易得多)......

假设我们有一个文件,其名称jsonConfigFile.json包含您帖子中的以下内容:

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

这将从 JSON 文件创建有序哈希表,以帮助更轻松地检索:

$json = [ordered]@{}

(Get-Content "jsonConfigFile.json" -Raw | ConvertFrom-Json).PSObject.Properties |
    ForEach-Object { $json[$_.Name] = $_.Value }

$json.Stuffs将列出一个不错的哈希表,但从这里开始会变得更复杂一些。假设您希望Type键的值与Clean Toilet键关联,您可以像这样检索它:

$json.Stuffs.Where({$_.Name -eq "Clean Toilet"}).Type

这是一个痛苦的屁股,但如果您的目标是在准系统 Windows 10 安装上使用 JSON,那么据我所知,这是最好的方法。

于 2020-05-14T20:47:52.673 回答
1

这是我的 json 数据:

[
   {
      "name":"Test",
      "value":"TestValue"
   },
   {
      "name":"Test",
      "value":"TestValue"
   }
]

Powershell脚本:

$data = Get-Content "Path to json file" | Out-String | ConvertFrom-Json

foreach ($line in $data) {
     $line.name
}
于 2019-01-07T07:16:28.483 回答