【问题标题】:Powershell ConvertFrom-Json: Selecting Value of Nested Array Based on Property NamePowershell ConvertFrom-Json:根据属性名称选择嵌套数组的值
【发布时间】:2021-06-30 06:14:53
【问题描述】:

我有一个 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 文件有几十个项目标签,它们的顺序可能会有所不同,所以我想做的只是根据项目标签的“名称”选择一个,例如选择项目标签名称为标签 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 的排序可能会因一天而异,所以这不会完全做到这一点。我将如何修改它以根据“标签 4”的 ItemTag 名称进行选择?

【问题讨论】:

    标签: arrays json powershell nested convertfrom-json


    【解决方案1】:

    这对我有用:

    Expression = { ($_.ItemTags | Where-Object Name -eq 'Tag 4').Value }
    

    通过仅指定$_.ItemTags,我们正在创建一个包含所有ItemTags 对象的数组。使用Where-Object,我们只选择这些元素,其Name 成员等于'Tag 4'。最后,我们从结果元素中得到 Value 成员。请注意,当有多个匹配元素时,这将是一个数组,这适用于您的示例数据 ('Yes','No')。

    【讨论】:

    • 干得好;因为.Where() 数组方法没有得到足够的爱:更有效的选择:Expression = { ($_.ItemTags.Where({ $_.Name -eq 'Tag 4' }).Value }
    • @zett42 谢谢!这工作得很好。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2021-05-23
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多