2017-08-07 203 views
1

我开始学习Powershell,我正在尝试读取JSON文件。如何从Powershell脚本读取JSON数据并遍历它

这里是我的JSON文件(名为“versions.json”):

{ 
    "versions": { 
     "1.0.0": { 
      "Component1": "1.0.0", 
      "Component2": "1.0.0", 
      "Component3": "1.0.0", 
     }, 
     "2.0.0": { 
      "Component1": "2.0.0", 
      "Component2": "2.0.0", 
      "Component3": "2.0.0" 
     } 
    } 
} 

我想在这个JSON文件的读取和打印出来的版本和它们包含的内容。例如,1.0.0由1.0.0的组件1,1.0.0的组件2和1.0.0的组件3组成。

我目前正在读与本Powershell的行JSON文件:

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

现在,我想通过$ JSON遍历并打印出它的数据。我目前使用这样的:

foreach($v in $json.versions) { 
    echo "Data: $v" 
} 

但是,当我运行PowerShell脚本,它打印:

Data: @{1.0.0=; 2.0.0=} 

这是正确的输出?我期待至少看到1.0.0和2.0.0的两个条目。这感觉可能是一个语法问题,但我不确定。我使用PowerShell的版本5

+0

的“$ V”在原岗位缺失。我修复了它。 – Roka545

+1

这不是一个集合,这就是为什么你不能迭代它。如果你做'$ json.versions | get-member'你会看到1.0.0和2.0.0是单个项目的属性。 –

回答

1

使用ConvertFrom-Json之后,你有一个PowerShell的对象,它是有它有两个子属性1.0.02.0.0一个versions属性的单个项目。你的ForEach试图像集合一样迭代它们,但它只是一个单一的对象。

但是你可以通过属性迭代如下得到的结果我想你想:

($Json.versions.psobject.properties) | foreach-object { "Data: $($_.name)" } 
+0

当我运行你的代码片段时,我在命令管道位置1上得到了“cmdlet ForEach-Object”。为以下参数提供值:Process [0]“ – Roka545

+1

你确定把它正确地复制了吗?这表明你错过了scriptblock部分(这一位'{“Data:$($ _。name)”}') –

+0

嗯,我猜一切都必须在一行上(我移动了“Data:”部分现在当我运行它的时候,我得到了“Data:” - 没有任何内容 – Roka545