Вы наткнулись на ужасную комбинацию двух странностей PowerShell при преобразовании массивов JSON:
Invoke-RestMethod
и ConvertFrom-Json
отправляют преобразованные из JSON массивы в целом по конвейеру, а не поэлементно, как обычно:
Примечание. В PowerShell (Core) 7.0 поведение ComvertFrom-Json
было изменено, чтобы привести его в соответствие с обычным поведением перечисления элементов, и переключатель -NoEnumerate
был добавлен в качестве подписки к старому поведению. Обсуждение, которое привело к этому изменению, см. в разделе GitHub issue #3424.
Однако на момент написания этой статьи (PowerShell (Core 7.2) Invoke-RestMethod
по-прежнему демонстрирует это неожиданное поведение, которое обсуждается в GitHub issue #15272.
Select-Object
не выполняет перечисление членов, поэтому ищет указанное свойство (например, text
) непосредственно в массиве там, где его нет.
Чтобы продемонстрировать проблему на простом примере:
# Windows PowerShell only:
# Because ConvertFrom-Json sends an *array* (of 2 custom objects) through
# the pipeline, Select-Object looks for property .text on the *array* -
# and can't find it.
# The same applies to Invoke-RestMethod (also still in
# PowerShell (Core) as of v7.2)
PS> ConvertFrom-Json '[{ "text": "a" }, { "text": "b" }]' | Select-Object text
text
----
# NO VALUES
Простой обходной путь состоит в том, чтобы заключить вызов ConvertFrom-Json
/ Invoke-RestMethod
в (...)
, что вынуждает перечислять массив, заставляя Select-Object
работать должным образом.:
# (...) forces enumeration
PS> (ConvertFrom-Json '[{ "text": "a" }, { "text": "b" }]') | Select-Object text
text
----
a
b
Обратите внимание, что такая команда, как Select-Object -Property text
(без -ExpandProperty
), по-прежнему выводит пользовательские объекты, имеющие свойство .text
, а не значения свойства .text
.
Если все, что вас интересует, это значения свойств, решение проще, потому что вы можете использовать вышеупомянутое перечисление элементов непосредственно в массиве:
# Using .<propName> on an array (collection) implicitly returns the
# property values from the *elements* of that collection (member enumeration).
PS> (ConvertFrom-Json '[{ "text": "a" }, { "text": "b" }]').text
a
b
Обратите внимание, что вывод теперь не имеет заголовка text
, потому что выводятся просто строковые значения, а не пользовательские объекты.
person
mklement0
schedule
06.07.2019
Select-Object
возвращает объекты с пустыми реквизитами, — это использование неправильного имени для рассматриваемых реквизитов. Итак ... проверьте, как называются ваши НАСТОЯЩИЕ реквизиты, и используйте их. если вы хотите изменить эти имена свойств, используйте вычисляемое выражение. - person Lee_Dailey   schedule 06.07.2019text
prop. единственным свойством являетсяall
, которое содержит массив, содержащий объекты со свойством.text
. - person Lee_Dailey   schedule 06.07.2019@
, чтобы пометить их. Извиняюсь. Позвольте мне взглянуть на свойствоAll
. Мои исходные данные - это подобъекты в массиве. Интересно. - person ΩmegaMan   schedule 06.07.2019