Powershell ConvertFrom-json 省略深度 > 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命令窗口中使用以下代码片段,

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在评论中指出的那样,只有在PowerShell (Core) v6.2+ConvertFrom-Json才有-Depth参数。然而,即使它对您可用,它既不需要也不会有帮助,因为ConvertFrom-Json正确地解析JSON嵌套深度1024级别默认.

  • 换句话说:ConvertFrom-Json -Depth $someDepth只需要在不太可能的情况下,您的JSON具有1024级别更多的如果您希望确保输入JSON不超过给定的嵌套深度(因为超过它会导致错误-不像-Depth与互补的cmdletConvertTo-Json的工作方式-参见这篇文章)。

您的问题源于>, PowerShell的重定向操作符实际上是Out-File的别名,当给定复杂对象作为输入时,使用相同的for-display表示保存它们,您将在控制台中看到-并且使用像您这样的深度嵌套输入对象,结果解释可能是没有帮助的(因为您的输入对象有超过4个顶级属性,它隐式地使用Format-List格式化)。

  • 注意:您实际上使用的是cmd.exe>操作符,但上述仍然适用,因为当PowerShell输出到外部调用者的stdout时,也应用了相同的格式。

所以你要决定的问题是:

  • 您希望在文件temp2.txt中保存什么表示?

  • 您正在寻找for-display表示—用于人类观察者—还是适合以后编程处理的格式?

如果您主要希望美观地打印输入JSON,您可以使用ConvertFrom-Json/ConvertTo-Json往返操作,其输出将在默认情况下打印得很漂亮:

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

注意:

  • 如上所述,使用ConvertTo-Json,即将重新转换为JSON,-Depth(也可在Windows PowerShell中使用)更有可能需要(尽管不是与您的特定输入对象),因为默认深度仅为2,超过它会导致安静截断(直到PowerShell 7.0;从v7.1开始,至少会发出一个警告) -再次,请参阅这篇文章。

  • 我已经简化了调用powershell.exe(Windows PowerShell CLI调用)的附带方面-要了解两个PowerShell版本中CLI的全面概述,请参阅此回答。

  • 考虑到cmd.exe使用系统的活动OEM代码页,您可能会遇到非ascii字符的字符编码问题。从PowerShell命令中保存到文件可以让您控制所需的编码。

相关内容

  • 没有找到相关文章

最新更新