我正在为我的网站编写一个使用JSON配置文件的脚本.JSON类似于以下内容:
"Groups": {
    "GroupOne": {
        "NamingFilter": {
            "Not":"<SITE>-MJ*",
            "Has":"*WM,*WT"
        }
    },
    "GroupTwo": {
        "NamingFilter": {
            "Has":"<SITE>-MJ*, *WC,*WL"
        }
    },
    "GroupThree": {
        "NamingFilter": {
            "Not":"<SITE>-MJ*",
            "Has":"*WI"
        }
    }
}
要将对象转换为PowerShell可以读取的内容,我使用ConvertFrom-Json将其转换为类型PSCustomObject.
我正处于这样一个阶段,我必须遍历Groups并获取每个组名称以在配置Groups对象中输出它们及其相应的索引.那是,
1. GroupOne
2. GroupTwo
3. GroupThree
我得到的最远的是:
foreach ($group in $configObject.Groups) {
    $group
}
所有这些都是输出看起来像PowerShell数组表示法的东西:
@{GroupOne=; GroupTwo=; GroupThree=;}
这种PSCustomObject类型甚至可以实现吗?我主要使用JavaScript编写代码,因此我可能会过度简化(或过度复杂化)这个问题,因为这样会相对简单.
Ver*_*Ray 16
我不确定你可以在多长时间内完成这个版本,但它在PowerShell 5.1中适用于我...请在早期版本中试一试:
$ipinfo = Invoke-WebRequest 'http://ipinfo.io/json' -UseBasicParsing | ConvertFrom-Json
foreach ($info in $ipinfo.PSObject.Properties) {
    $info.Name
    $info.Value
    '--' # <-- Seeing this double hash proves we're iterating fully.
}
ip
1.2.3.4
--
hostname
No Hostname
--
city
Denton
--
region
Texas
--
country
US
--
loc
33.2148,-97.1331
--
org
AS589 University of North Texas
--
postal
76203
--
这一切都是使用PowerShell 4.0完成的; ConvertTo-Json并ConvertFrom-Json在PowerShell 3.0中引入; 我还没有测试过PowerShell 3.0或5.0.
用另一个例子自己尝试一下:
$ipinfo = ConvertFrom-Json (Invoke-WebRequest 'http://ipinfo.io/json' -UseBasicParsing)
foreach ($info in ($ipinfo.PSObject.Members | ?{ $_.MemberType -eq 'NoteProperty'})) {
    $info.Name
    $info.Value
    '--'
}
ip
1.2.3.4
--
hostname
No Hostname
--
city
Denton
--
region
Texas
--
country
US
--
loc
33.2148,-97.1331
--
org
AS589 University of North Texas
--
postal
76203
--
Som*_*ica 10
我想我可能只是想通过博客文章转换PsCustomObject To/From Hashtables.
使用Get-Member然后-MemberType公开每个组然后你只需拉出:
foreach ($group in $configObject.Groups) {
    $groupName = $($group | Get-Member -MemberType *Property).Name
}
输出:
GroupOne
GroupTwo
GroupThree
我对任何其他方法持开放态度.
我找到了另一种方法,但唯一的缺点是它不使用花哨的ConvertFrom-JsonCmdLet.相反,它直接进入.NET库并使用其反序列化器并将其转换为HashTable.这完全避免了与PSCustomObject混在一起.IMO哈希表更易于使用.
$JSON = Get-Content -Path path/to.json -Raw
$HT = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($JSON, [System.Collections.Hashtable])
$HT.Groups.GetEnumerator() | ForEach-Object {
    Write-Host "$($_.Key) : $($_.Value)"
}