在转换 JSON数组时,您偶然发现了两个 PowerShell 怪异的邪恶组合:
用一个简单的例子来演示这个问题:
# 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
(without -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
标题,因为它只是输出的字符串值 ,而不是自定义对象。