#arrays #powershell #object #projection
Вопрос:
Учитывая следующий JSON
[ { "key": "James", "things": [ { "id": 123, "name": "PRD" }, { "id": 124, "name": "PRE" } ] }, { "key": "Susan", "things": [ { "id": 125, "name": "PRF" }, { "id": 126, "name": "PRG" } ] } ]
Который я легко преобразовал в объект Powershell:
$json = '[{"key":"James", "things":[{"id":123,"name":"PRD"},{"id":124,"name":"PRE"}]},{"key":"Susan", "things":[{"id":125,"name":"PRF"},{"id":126,"name":"PRG"}]}]' $obj = $json | ConvertFrom-Json
Как мне сгладить поддиапазон things
и включить объект key
из родительского объекта, чтобы мой результирующий набор был
key id name --- -- ---- James 123 PRD James 124 PRE Susan 125 PRF Susan 126 PRG
Я использовал следующее, чтобы сгладить поддиапазон:
$obj | % { $_.things}
Что возвращает меня
id name -- ---- 123 PRD 124 PRE 125 PRF 126 PRG
Но я не совсем понимаю, что делать дальше.
Любая помощь была бы очень признательна.
Комментарии:
1. К твоему сведению, на случай, если ты не знал
$obj | % { $_.things}
, можно заменить$obj.things
. Powershell сделает свое дело, перечислит вещи и в любом случае выдаст один и тот же результат.
Ответ №1:
Вы зацикливаетесь на каждом ключе, затем зацикливаетесь на каждой вещи, так как вам нужен 1 результат за вещь, и создаете PSObject, используя текущий ключ, идентификатор и имя.
Вот, держи.
# initial code sample $json = '[{"key":"James", "things":[{"id":123,"name":"PRD"},{"id":124,"name":"PRE"}]},{"key":"Susan", "things":[{"id":125,"name":"PRF"},{"id":126,"name":"PRG"}]}]' $obj = $json | ConvertFrom-Json # Loop needed to flatten the object. foreach ($i in $obj) { foreach ($t in $i.things) { [PSCustomObject]@{ key = $i.key id = $t.id name = $t.name } } }
Выход
key id name --- -- ---- James 123 PRD James 124 PRE Susan 125 PRF Susan 126 PRG
Комментарии:
1. Хмммм «Не удается преобразовать значение в тип «Система.Управление. Автоматизация. Языковые примитивы внутренний предмет». В этом языковом режиме поддерживаются только основные типы.»
2. @JamesWiseman Это потому, что вы работаете в ограниченном режиме. Насколько я знаю, этот режим очень ограничен в том, что вы можете делать. Возможно, вы сможете выполнить конвейерный конвейер для каждого из них с использованием переменной конвейера и вывести свои выходные данные с помощью инструкции select, в которой используется вычисляемое свойство для ключа… Однако я не уверен, что вычисляемые свойства работают в ограниченном режиме. Я проверю, когда вернусь к компьютеру.
3. Оказывается, это была моя локальная политика безопасности Windows. Запуск сценария в Powershell ISE с повышенными правами администратора исправил это. Интересный мысленный эксперимент, однако, достигающий этого с помощью более примитивного powershell.