【发布时间】:2017-05-03 00:36:48
【问题描述】:
从我通过 Invoke-RestMethod 检索到的大型 PowerShell 对象中,我希望将其缩小以选择属性并创建一个新的(较小的)对象,然后我可以将其转换为 JSON 数组。
样本集由“The Scripting Guy”提供:
$request = 'http://musicbrainz.org/ws/2/artist/5b11f4ce-a62d-471e-81fc-a69a8278c7da?inc=aliases&fmt=json'
$output = Invoke-WebRequest $request | ConvertFrom-Json
$output
给我:
type-id : e431f5f6-b5d2-343d-8b36-72607fffb74b
name : Nirvana
ipis : {}
disambiguation : 90s US grunge band
country : US
life-span : @{end=1994-04-05; ended=True; begin=1988-01}
sort-name : Nirvana
isnis : {0000000123486830}
aliases : {@{name=Nirvana US; type-id=; sort-name=Nirvana US; end=;
begin=; primary=; type=; locale=; ended=False}}
begin_area : @{name=Aberdeen; disambiguation=; sort-name=Aberdeen;
id=a640b45c-c173-49b1-8030-973603e895b5}
area : @{sort-name=United States; id=489ce91b-6658-3307-9877-795b68554c98; iso-3166-1-codes=System.Object[]; disambiguation=; name=United States}
type : Group
id : 5b11f4ce-a62d-471e-81fc-a69a8278c7da
end_area :
gender :
gender-id :
如果我在根级属性上使用 select 选项,这将按预期工作:
$request = 'http://musicbrainz.org/ws/2/artist/5b11f4ce-a62d-471e-81fc-
a69a8278c7da?inc=aliases&fmt=json'
$output = Invoke-WebRequest $request | ConvertFrom-Json
$output | select name, disambiguation | ConvertTo-Json
输出:
{
"name": "Nirvana",
"disambiguation": "90s US grunge band"
}
但是如果我尝试添加其中一个嵌套属性,它就不会像我希望的那样工作......
$output | select name, disambiguation, area.sortname | ConvertTo-Json
{
"name": "Nirvana",
"disambiguation": "90s US grunge band",
"area.sort-name": null # <-- Expect "United States"
}
我想看什么:
{
"name": "Nirvana",
"disambiguation": "90s US grunge band",
"area": {
"sort-name": "United States"
}
}
我也尝试过扩展数组,但这似乎丢失了我想要保留的根级别字段:
$output | select -expand area | select name, disambiguation, sort-name | ConvertTo-Json
{
"name": "United States", # <-- Taken from the area.name value
"disambiguation": "", # <-- Lost when expanding
"sort-name": "United States"
}
非常感谢任何建议/指针!
【问题讨论】:
-
select name, @{Name='sort-name'; Expression={$_.area.sort-name}},它是一个计算属性,以及当它不像直接选择现有属性名称那样简单时如何生成“虚拟”属性。 -
啊,太耸人听闻了!而已!多谢!只需要在
sort-name周围加上括号,因此最终(工作)结果是:select name, @{Name='sort-name'; Expression={$_.area.{sort-name}}} -
@Arrjo:将其作为答案并稍后接受答案。
-
也可以使用convertto-json中的-depth参数来获取嵌套属性
标签: json powershell