Выравнивание подмассива в объекте Powershell, включая свойство родительского объекта

#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.