为什么 ConvertFrom-Json 生成的对象在赋值后会变成 PSCustomObject?我该如何走捷径呢?

Dar*_*ren 4 powershell json

我有一个简单的 json 文件,如下所示:

[
    {"ClientName": "Test Site 1", "ClientID": "000001"},
    {"ClientName": "Test Site 2", "ClientID": "000002"},
    {"ClientName": "Test Site 3", "ClientID": "000003"}
]
Run Code Online (Sandbox Code Playgroud)

当我使用以下 PowerShell 命令时:

ConvertFrom-Json (Get-Content TestSites.json -Raw)

我回来了System.Object[]。这不允许我将输出通过管道传输到另一个接受“ClientName”和“ClientID”参数的函数。

但是,当我将该对象分配给另一个变量时,如下所示:

$myobj = ConvertFrom-Json (Get-Content TestSites.json -Raw)

$myobj实际上是System.Management.Automation.PSCustomObject能够传递给我的函数的。

如何仅通过管道传输原始命令的结果,而不必先将其分配给另一个变量?

我希望这是有道理的。

Mat*_*att 5

你的 JSON 是一个数组,对吗?PowerShell 将在管道中展开数组,除非您明确更改该行为。假设您的 JSON 作为单个字符串存储在变量中,$json请考虑以下示例。

ConvertFrom-Json $json | ForEach-Object{$_.gettype().fullname}
System.Object[]

(convertFrom-Json $json) | ForEach-Object{$_.gettype().fullname}
System.Management.Automation.PSCustomObject
System.Management.Automation.PSCustomObject
System.Management.Automation.PSCustomObject
Run Code Online (Sandbox Code Playgroud)

您应该能够将表达式括在括号中以更改结果。在第二个示例中,它应该将 3 个对象分别发送到管道中。在第一个中,它作为单个对象数组发送。

我的解释需要改进,但我确信原因是 PowerShell 处理数组和管道的方式。展开是用来描述它的常用词。

因此,根据您的用例,您可能只需将表达式括在括号中,以便在ForEach我的示例中的管道之前对其进行处理。