【问题标题】:How to read JSON data from Powershell script and iterate through it如何从 Powershell 脚本中读取 JSON 数据并对其进行迭代
【发布时间】:2018-01-15 05:50:18
【问题描述】:

我开始学习 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。

【问题讨论】:

  • 原始帖子中缺少“$v”。我已经修好了。
  • 它不是一个集合,这就是为什么你不能迭代它。如果您执行$json.versions | get-member,您将看到 1.0.0 和 2.0.0 是单个项目的属性。

标签: json powershell scripting


【解决方案1】:

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

但是,您可以按如下方式迭代属性以获得我认为您想要的结果:

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

【讨论】:

  • 当我运行您的代码 sn-p 时,我在命令管道位置 1 处得到“cmdlet ForEach-Object。为以下参数提供值:Process[0]”
  • 您确定复制正确吗?这表明您缺少脚本块部分(此位 { "Data: $($_.name)" }
  • 嗯,我想一切都必须在一行上(我将“数据:”部分和括号向下移动。现在当我运行它时,我得到“数据:” - 什么都没有.
  • 只是开头{ 需要在同一行,然后您可以根据需要添加换行符。
  • 我的错 - 我的文件中有错字。你的 sn-p 工作正常。我接受了你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2021-03-31
相关资源
最近更新 更多