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').

Другие вопросы по тегам