Powershell ConvertFrom-Json: выбор значения вложенного массива на основе имени свойства
У меня есть файл json, который я пытаюсь экспортировать в csv с помощью powershell, но мне нужны только определенные вложенные значения. Это выглядит так:
[
{
"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 есть десятки тегов элементов, и их порядок может варьироваться, поэтому я хотел бы выбрать только те, которые основаны на «Имя» тега ItemTag, например, выберите значение ItemTag, где NameTag Name - это тег 4.
Я смог сделать это только в таком порядке:
$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 может отличаться от одного дня к другому, это не совсем так. Как мне изменить это, чтобы выбрать на основе имени ItemTag «Tag 4»?
1 ответ
Это работает для меня:
Expression = { ($_.ItemTags | Where-Object Name -eq 'Tag 4').Value }
Указав просто
$_.ItemTags
мы создаем массив всех
ItemTags
объекты. С использованием
Where-Object
мы выбираем только те элементы, у которых
Name
член равен
'Tag 4'
. В итоге получаем
Value
член из результирующих элементов. Обратите внимание, что это будет массив, если есть более одного совпадающего элемента, что верно для ваших данных образца (
'Yes','No'
).