Powershell ConvertFrom-Json:根据 属性 名称选择嵌套数组的值
Powershell ConvertFrom-Json: Selecting Value of Nested Array Based on Property Name
我有一个 json 文件,我正尝试使用 powershell 将其导出到 csv,但我只需要某些嵌套值。看起来像下面这样:
[
{
"ItemName": "A",
"ItemID": "I001",
"ItemDate": "2021-03-01",
"ItemValue": "1000",
"ItemTags": [
{
"Name": "First tag name",
"Value": "medium"
},
{
"Name": "Another tag name",
"Value": "red"
},
{
"Name": "Tag 3",
"Value": null
},
{
"Name": "Tag 4",
"Value": "Yes"
}
]
},
{
"ItemName": "B",
"ItemID": "I002",
"ItemDate": "2021-02-01",
"ItemValue": "3000",
"ItemTags": [
{
"Name": "First tag name",
"Value": "best"
},
{
"Name": "Another tag name",
"Value": "green"
},
{
"Name": "Tag 3",
"Value": null
},
{
"Name": "Tag 4",
"Value": "No"
}
]
}
]
嵌套的“ItemTags”部分是我遇到问题的地方。实际的 json 文件有几十个项目标签,它们的顺序可能会有所不同,所以我想做的只是 select 基于项目标签的“名称”的标签,例如 select ItemTag 名称为标签 4 的 ItemTag 值。
我只能按照这样的顺序来做:
$obj1 = Get-Content -Path "C:\Temp\sample.json" | ConvertFrom-Json
$obj1 | select ItemName, ItemID, ItemDate, ItemValue, @{Name = 'Tag 4'; Expression ={$_.ItemTags[3].Value}} | Export-CSV "C:\Temp\items.csv" -NoTypeInformation
但同样,由于 ItemTags 的排序每天都可能不同,因此这并不能完全做到。我如何根据“标签 4”的 ItemTag 名称将其修改为 select?
这对我有用:
Expression = { ($_.ItemTags | Where-Object Name -eq 'Tag 4').Value }
通过仅指定 $_.ItemTags
,我们将创建一个包含所有 ItemTags
对象的数组。使用 Where-Object
我们只 select 这些元素,其 Name
成员等于 'Tag 4'
。最后我们从结果元素中得到 Value
成员。请注意,当有多个匹配元素时,这将是一个数组,这对于您的示例数据 ('Yes','No'
) 是正确的。
我有一个 json 文件,我正尝试使用 powershell 将其导出到 csv,但我只需要某些嵌套值。看起来像下面这样:
[
{
"ItemName": "A",
"ItemID": "I001",
"ItemDate": "2021-03-01",
"ItemValue": "1000",
"ItemTags": [
{
"Name": "First tag name",
"Value": "medium"
},
{
"Name": "Another tag name",
"Value": "red"
},
{
"Name": "Tag 3",
"Value": null
},
{
"Name": "Tag 4",
"Value": "Yes"
}
]
},
{
"ItemName": "B",
"ItemID": "I002",
"ItemDate": "2021-02-01",
"ItemValue": "3000",
"ItemTags": [
{
"Name": "First tag name",
"Value": "best"
},
{
"Name": "Another tag name",
"Value": "green"
},
{
"Name": "Tag 3",
"Value": null
},
{
"Name": "Tag 4",
"Value": "No"
}
]
}
]
嵌套的“ItemTags”部分是我遇到问题的地方。实际的 json 文件有几十个项目标签,它们的顺序可能会有所不同,所以我想做的只是 select 基于项目标签的“名称”的标签,例如 select ItemTag 名称为标签 4 的 ItemTag 值。
我只能按照这样的顺序来做:
$obj1 = Get-Content -Path "C:\Temp\sample.json" | ConvertFrom-Json
$obj1 | select ItemName, ItemID, ItemDate, ItemValue, @{Name = 'Tag 4'; Expression ={$_.ItemTags[3].Value}} | Export-CSV "C:\Temp\items.csv" -NoTypeInformation
但同样,由于 ItemTags 的排序每天都可能不同,因此这并不能完全做到。我如何根据“标签 4”的 ItemTag 名称将其修改为 select?
这对我有用:
Expression = { ($_.ItemTags | Where-Object Name -eq 'Tag 4').Value }
通过仅指定 $_.ItemTags
,我们将创建一个包含所有 ItemTags
对象的数组。使用 Where-Object
我们只 select 这些元素,其 Name
成员等于 'Tag 4'
。最后我们从结果元素中得到 Value
成员。请注意,当有多个匹配元素时,这将是一个数组,这对于您的示例数据 ('Yes','No'
) 是正确的。