展平 Powershell 对象中的子数组,包括父对象属性

Posted

技术标签:

【中文标题】展平 Powershell 对象中的子数组,包括父对象属性【英文标题】:Flattening a Sub-Array in a Powershell Object, including parent object property 【发布时间】:2022-01-04 09:15:50 【问题描述】:

鉴于以下 JSON

[
  
    "key": "James",
    "things": [
      
        "id": 123,
        "name": "PRD"
      ,
      
        "id": 124,
        "name": "PRE"
      
    ]
  ,
  
    "key": "Susan",
    "things": [
      
        "id": 125,
        "name": "PRF"
      ,
      
        "id": 126,
        "name": "PRG"
      
    ]
  
]

其中,我已轻松转换为 Powershell 对象:

$json = '["key":"James", "things":["id":123,"name":"PRD","id":124,"name":"PRE"],"key":"Susan", "things":["id":125,"name":"PRF","id":126,"name":"PRG"]]'

$obj = $json | ConvertFrom-Json 

如何展平子数组things 并包含父对象中的key,这样我的结果集就是

key    id name
---    -- ----
James 123 PRD  
James 124 PRE  
Susan 125 PRF
Susan 126 PRG

我使用以下方法来展平子数组:

$obj | %  $_.things  

这让我回来了

 id name
 -- ----
123 PRD  
124 PRE  
125 PRF
126 PRG

但是,我不知道下一步该做什么。

任何帮助将不胜感激。

【问题讨论】:

仅供参考,如果您不知道 $obj | % $_.things 可以替换为 $obj.things 。 Powershell 将做它的事情,枚举事物并在任何一种情况下产生相同的输出。 【参考方案1】:

您循环到每个键,然后循环到每个事物,因为您希望每个事物有 1 个结果,并使用当前键、id 和名称构建一个 PSObject。

给你。

# initial code sample
$json = '["key":"James", "things":["id":123,"name":"PRD","id":124,"name":"PRE"],"key":"Susan", "things":["id":125,"name":"PRF","id":126,"name":"PRG"]]'
$obj = $json | ConvertFrom-Json 

# Loop needed to flatten the object.
foreach ($i in $obj) 
    foreach ($t in $i.things) 
        [PSCustomObject]@
            key  = $i.key
            id   = $t.id
            name = $t.name
        
    

输出

key    id name
---    -- ----
James 123 PRD
James 124 PRE
Susan 125 PRF
Susan 126 PRG

【讨论】:

Hmmmm "无法将值转换为类型 "System.Management.Automation.LanguagePrimitives+InternalPSCustomObject"。此语言模式仅支持核心类型。" @JamesWiseman 那是因为您在受限模式下工作。据我所知,这种模式能做的事情非常有限。您可能可以使用管道变量为每个管道执行 pipeldouble 管道,并通过使用计算属性作为键的 select 语句生成输出......虽然不确定计算属性是否在约束模式下工作。当我回到电脑前时,我会检查一下。 原来是我的本地 Windows 安全策略。使用提升的“管理员”权限在 Powershell ISE 中运行脚本修复了此问题。不过有趣的思想实验,用更原始的 powershell 来实现。【参考方案2】:

您可以使用 select 的内置展平功能,如下所示:

($json | ConvertFrom-Json) | Select-Object 键-ExpandProperty 东西

【讨论】:

以上是关于展平 Powershell 对象中的子数组,包括父对象属性的主要内容,如果未能解决你的问题,请参考以下文章

在 PowerShell 中将没有展平列表的 JSON 数组写入文件

展平对象中的数组

使用 jq 为 JSON 对象的嵌套数组中的属性展平数组

将嵌套的 JSON 对象展平并排序到 javascript 中的数组中

雪花中具有多个 JSON 对象的横向展平数组

将具有子数组的对象数组映射和减少到具有父 ID 的子数组