Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将多个JSON文件读取到Powershell对象数组中,并筛选出属性值相同的JSON文件_Arrays_Json_Powershell_Enumeration - Fatal编程技术网

Arrays 将多个JSON文件读取到Powershell对象数组中,并筛选出属性值相同的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",

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

我有很多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对象一样。结果可能如下所示:

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" }