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```

1 ответ

Решение

Как Jeroen Mostert отмечает в комментарии, только в PowerShell (ядро) v6.2+ делает есть параметр. Однако, даже если бы он был вам доступен, он не понадобился бы и не помог, потому что правильно анализирует JSON с глубиной вложенности до уровней по умолчанию .

  • Другими словами: ConvertFrom-Json -Depth $someDepthэто только необходимо в маловероятном случае, если ваш JSON имеет более чем 1024уровней или если вы хотите убедиться, что входной JSON не превышает заданную глубину вложенности (поскольку ее превышение приводит к ошибке - в отличие от того, как работает с дополнительным командлетом, - см. ).

Ваша проблема связана с тем, что оператор перенаправления PowerShell фактически является псевдонимом Out-File, который, когда в качестве входных данных заданы сложные объекты, сохраняет их, используя то же представление для отображения, которое вы видите в консоли, а с глубоко вложенным входным объектом, таким как ваш, результирующая интерпретация может быть бесполезной (поскольку ваш входной объект имеет более 4 свойства верхнего уровня, он неявно отформатирован с помощью Format-List).

  • Примечание. На самом деле вы используете > оператор, но вышеизложенное по-прежнему применяется, потому что такое же форматирование также применяется, когда PowerShell выводит на стандартный вывод внешнего вызывающего объекта.

Итак, вам нужно решить следующий вопрос:

  • Какое представление вы хотите сохранить в файле temp2.txt?

  • Вы ищете представление для отображения - для человека-наблюдателя - или формат, подходящий для последующей программной обработки ?

Если вы в первую очередь хотите красиво распечатать входной JSON, вы можете использовать ConvertFrom-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, и его превышение приводит к тихому усечению (до PowerShell 7.0; начиная с версии 7.1, по крайней мере , выдается предупреждение ) - снова см. этот постэтот пост .

  • Я упростил случайные аспекты вашего звонка powershell.exe, вызов интерфейса командной строки Windows PowerShell - подробный обзор интерфейса командной строки в обоих выпусках PowerShell см. в этом ответе .

  • Вы можете столкнуться с проблемами кодировки символов с символами, отличными от ASCII, учитывая, что cmd.exeиспользует активную кодовую страницу OEM системы. Сохранение в файл изнутри команды PowerShell может дать вам контроль над желаемой кодировкой.

Другие вопросы по тегам