【问题标题】:Read multiple JSON files into an array of Powershell objects and filter out those with the same value for a property将多个 JSON 文件读入 Powershell 对象数组,并过滤​​掉具有相同属性值的对象
【发布时间】:2019-08-25 06:31:49
【问题描述】:

这是我的第一次,所以如果我的问题布局有问题,请告诉我。

我有很多 JSON 文件,其文件名遵循命名约定,即 file1.json、file2.json 等。每个文件都可能有多个对象,如下所示:

[
    {
        "Forename":  "Jim",
        "Surname":  "Cook",
        "Gender":  "M",
        "DOB":  "12-03-1994"
    },
    {
        "Forename":  "Sarah",
        "Surname":  "Parker",
        "Gender":  "F",
        "DOB":  "01-02-1983"
    },
    {
        "Forename":  "Alan",
        "Surname":  "Flemming",
        "Gender":  "M",
        "DOB":  "27-10-1989"
    }
]

在 Powershell 中,我想将这些 JSON 对象转换为 Powershell 对象,然后选择具有相同属性值的对象,例如名字为“Jim”的人。

到目前为止,我已经做到了:

@(Get-ChildItem "file*.json" | %{Get-Content $_.FullName | Out-String | ConvertFrom-Json}) | Where-Object {$_.Forename -eq "Jim"}

这适用于只有一个文件可以使用,输出:

Forename Surname Gender DOB
-------- ------- ------ ---
Jim      Cook    M      12-03-1994

但是,当与多个文件一起使用时,它会失败并输出所有对象,就好像 Where-Object 被忽略了一样。结果可能如下所示:

Forename Surname  Gender DOB
-------- -------  ------ ---
Jim      Cook     M      12-03-1994
Sarah    Parker   F      01-02-1983
Alan     Flemming M      27-10-1989
Bill     Preston  M      04-07-1975
Helen    Smith    F      03-12-2001

有人可以建议我在这里做错了什么以及如何解决它以获得正确的结果吗?谢谢

【问题讨论】:

    标签: arrays json powershell enumeration


    【解决方案1】:

    问题在于,在最高 v6.x 的 PowerShell 版本中ConvertFrom-Json 输出(转换自)JSON 数组作为单个 对象 而不是 逐个元素,这在 PowerShell 中很常见。

    • 注意:在 PowerShell [Core] 7.0 中,行为已更改以与通常的元素枚举行为保持一致,并且 @987654323 @switch 被添加为对旧行为的选择。

    如果(至少)其中一个 元素 具有值为 Jim.ForeName 属性,这将导致 整个数组Where-Object 输出,感谢member enumeration

    解决方法 是强制枚举,最简单的情况是通过ConvertFrom-Json 调用包装在(...) 中来实现:

    Get-ChildItem file*.json | ForEach-Object {
      (Get-Content -Raw $_.FullName | ConvertFrom-Json)
    } | Where-Object { $_.Forename -eq "Jim" }
    

    请注意,我已将 Get-Content $_.FullName | Out-String 替换为 Get-Content -Raw $_.FullName (PSv3+),这对于将文件内容作为单个多行字符串检索更加简洁和高效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-05
      • 2020-11-27
      • 2021-03-22
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多