Powershell ConvertFrom-Json 省略深度 > 1

Powershell ConvertFrom-Json omitting Depth > 1

鉴于此 JSON

{"name":"//iam.googleapis.com/projects/aw-b9a-8231-4086-a297-ca0/serviceAccounts/1081069135974252","asset_type":"iam.googleapis.com/ServiceAccount","resource":{"version":"v1","discovery_document_uri":"https://iam.googleapis.com/$discovery/rest","discovery_name":"ServiceAccount","parent":"//cloudresourcemanager.googleapis.com/projects/1090951556423","data":{"email":"default@aw-d1eb6b9a-8231-4086-a297-ca0.iam.gserviceaccount.com","name":"projects/aw-d1eb6b9a-8231-4086-a297-ca0/serviceAccounts/default@aw-d1eb6b9a-8231-4086-a297-ca0.iam.gserviceaccount.com","oauth2ClientId":"108102635374252","projectId":"aw-d1eb6b9a-8231-4086-a297-ca0","uniqueId":"108108526913531974252"}},"ancestors":["projects/1090951556423","folders/940897400840","folders/140924730741","organizations/437515948226"],"update_time":"2021-02-08T18:23:18Z"}

我正在尝试使用 Windows 命令 window、

中的以下代码片段

powershell -nologo -executionpolicy bypass "& {foreach($line in Get-Content temp.txt) {ConvertFrom-Json -InputObject $line}}" > temp2.txt

将检索到的键和值放入文件中 (temp2.txt)。但是,ConvertFrom-Json 仅获取 JSON 的第一个层次级别,现在位于 data 数组中。我试过 -Depth 3 但出现此错误:

At line:1 char:81
+ ... ontent temp.txt) {ConvertFrom-Json  -InputObject $line -Depth 4 -Comp ...
+                                                            ~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [ConvertFrom-Json], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.ConvertFromJsonCommand```

因为 Jeroen Mostert points out in a comment, only in PowerShell (Core) v6.2+ does ConvertFrom-Json 有一个 -Depth 参数。然而,即使它对你可用,它既不需要也没有帮助,因为 ConvertFrom-Json 正确解析 JSON 嵌套深度 高达 1024 等级 默认.

  • 换句话说:在 您的 JSON比1024水平如果你想确保输入JSON 不超过给定的嵌套深度(因为超过它会导致 错误 - 与 -Depth 与互补 cmdlet 的工作方式不同,ConvertTo-Json - see ).

您的问题源于 >、PowerShell 的 redirection operator is in effect an alias of Out-File, which, when given complex objects as input, saves them using the same for-display representation you would see in the console - and with a deeply nested input object such as yours the resulting interpretation can be unhelpful (since your input object has more than 4 top-level properties, it is implicitly formatted with Format-List)。

  • 注意:您实际上使用的是 cmd.exe> 运算符,但上述内容仍然适用,因为当 PowerShell 输出到外部调用者的标准输出时,也会应用相同类型的格式。

所以你要决定的问题是:

  • 您要在文件 temp2.txt 中保存什么表示形式?

  • 您是否在寻找 for-display 表示 - 对于 人类观察者 - 或者适合的格式稍后 程序化处理?

如果您主要希望 漂亮打印 输入 JSON,您可以使用 ConvertFrom-Json / ConvertTo-Json round-trip 操作,其输出将默认漂亮打印:

powershell -executionpolicy bypass -c "ConvertFrom-Json (Get-Content -Raw temp.txt) | ConvertTo-Json" > temp2.txt

注:

  • 如上文所述,用ConvertTo-Json,即重新转换JSON,-Depth(在 Windows PowerShell 中也可用)更有可能需要(尽管不是您的特定输入对象),因为默认深度仅为 2,超过它会导致 quiet t运行cation(最高 PowerShell 7.0;自 v7.1 起,至少发出 警告)- 再次参见

  • 我已经简化了您调用 powershell.exe 的附带方面,Windows PowerShell CLI call - for a comprehensive overview of the CLI in both PowerShell editions, see

  • 您可能 运行 遇到非 ASCII 字符的字符编码问题,因为 cmd.exe 使用系统的活动 OEM 代码页。从 PowerShell 命令内部保存到文件可以让您控制所需的编码。