Arrays 将多个JSON文件读取到Powershell对象数组中,并筛选出属性值相同的JSON文件
这是我第一次,所以如果我的问题布局有问题,请告诉我 我有很多JSON文件,其文件名遵循命名约定,即file1.JSON、file2.JSON等。每个文件都可能有多个对象,如下所示:Arrays 将多个JSON文件读取到Powershell对象数组中,并筛选出属性值相同的JSON文件,arrays,json,powershell,enumeration,Arrays,Json,Powershell,Enumeration,这是我第一次,所以如果我的问题布局有问题,请告诉我 我有很多JSON文件,其文件名遵循命名约定,即file1.JSON、file2.JSON等。每个文件都可能有多个对象,如下所示: [ { "Forename": "Jim", "Surname": "Cook", "Gender": "M", "DOB": "12-03-1994" }, { "Forename": "Sarah",
[
{
"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对象一样。结果可能如下所示:
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
有人能告诉我我做错了什么,以及如何纠正错误以得到正确的结果吗?感谢问题在于,在v6.x之前的PowerShell版本中,
ConvertFrom Json
将Json数组作为单个对象输出(从转换而来),而不是像PowerShell中典型的那样逐个元素输出
- 注意:在PowerShell[Core]7.0中,更改了行为以与元素行为的常规枚举保持一致,并添加了一个
开关作为旧行为的选择加入-NoEnumerate
获得输出,其中Object
如果(至少)它的一个元素具有值为Jim
的.ForeName
属性,这要感谢
解决方法是强制枚举,在最简单的情况下,可以通过将convertfromjson
调用包装在(…)
中来实现:
请注意,我已将Get Content$|FullName | Out String
替换为Get Content-Raw$|FullName
(PSv3+),这对于将文件内容检索为单行、多行字符串来说更简洁、更高效
Get-ChildItem file*.json | ForEach-Object {
(Get-Content -Raw $_.FullName | ConvertFrom-Json)
} | Where-Object { $_.Forename -eq "Jim" }