获取锯齿状数组的成员

获取锯齿状数组的成员

如何确定 powershell 中锯齿数组的唯一成员?

$jagged='{
    "id": "1",
    "data": [
        {
            "id": "1",
            "name": "Name1",
            "purpose": "purpose1"
        },
        {
            "id": "2",
            "purpose": "purpose2"
        },
        {
            "id": "3",
            "purpose": "purpose3",
            "user": "3"
        },
        {
            "id": "4",
            "purpose": "purpose4"
        }
    ]
}' | convertfrom-json

Get-Member 可能只考虑第一个元素

PS C:\> $jagged.data| get-member  |where {$_.MemberType -eq "NoteProperty"}


   TypeName: System.Management.Automation.PSCustomObject

Name    MemberType   Definition             
----    ----------   ----------             
id      NoteProperty string id=1            
name    NoteProperty string name=Name1      
purpose NoteProperty string purpose=purpose1

还有其他元素有不同的成员

PS C:\> $jagged.data[2]| get-member  |where {$_.MemberType -eq "NoteProperty"}


   TypeName: System.Management.Automation.PSCustomObject

Name    MemberType   Definition             
----    ----------   ----------             
id      NoteProperty string id=3            
purpose NoteProperty string purpose=purpose3
user    NoteProperty string user=3 

我想了解我使用的数据是否有锯齿,以及所有成员(和类型)是什么。我使用的数据是从第三方 Web 服务以 JSON 格式返回的,因此我无法实际预测它何时会发生变化或变化会是什么样子。

答案1

我的解决方案在此作为 PSA,供任何寻找类似解决方案的人使用,并希望由了解正确(并且可能简单)方法的 powershell 专家解答。

function Get-Jagged-Members {  
    @($Input)| %{get-member -inputobject $_ |where {$_.MemberType -eq "NoteProperty"}} | select Name,@{n="Definition"; e={ if($_.Definition -match "\S+") {$Matches[0]}}} |group Name, Definition|sort Count|select Name,Count
}

PS C:\> $jagged.data | Get-Jagged-Members

Name            Count
----            -----
name, string        1
user, string        1
id, string          4
purpose, string     4

它可以完成工作(就目前而言)..

相关内容