将多个 JSON 文件读入 Powershell 对象数组,并过滤掉具有相同值的 属性
Read multiple JSON files into an array of Powershell objects and filter out those with the same value for a property
这是我的第一次,如果我的问题布局有问题,请告诉我。
我有很多 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 对象,然后将 select 个具有相同值的对象转换为 属性,就像名字是 "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
有人可以建议我在这里做错了什么以及如何修复它以获得正确的结果吗?谢谢
问题是,PowerShell 版本高达 v6.x,ConvertFrom-Json
输出(转换自-)JSON 数组 作为单个 对象 而不是 一个元素接一个元素 ,这在 PowerShell 中是典型的。
- 注意:在 PowerShell [Core] 7.0 中,行为已更改 以对齐具有通常的元素枚举行为,并且添加了一个
-NoEnumerate
开关作为对旧行为的选择加入。
如果(至少)其中一个 元素 具有.ForeName
属性 的值为 Jim
,感谢 member-access 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+),这对于将文件内容检索为单个、多个线串.
这是我的第一次,如果我的问题布局有问题,请告诉我。
我有很多 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 对象,然后将 select 个具有相同值的对象转换为 属性,就像名字是 "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
有人可以建议我在这里做错了什么以及如何修复它以获得正确的结果吗?谢谢
问题是,PowerShell 版本高达 v6.x,ConvertFrom-Json
输出(转换自-)JSON 数组 作为单个 对象 而不是 一个元素接一个元素 ,这在 PowerShell 中是典型的。
- 注意:在 PowerShell [Core] 7.0 中,行为已更改 以对齐具有通常的元素枚举行为,并且添加了一个
-NoEnumerate
开关作为对旧行为的选择加入。
如果(至少)其中一个 元素 具有.ForeName
属性 的值为 Jim
,感谢 member-access 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+),这对于将文件内容检索为单个、多个线串.