我在查找数组中哈希表的索引时遇到了一些麻烦。我用这段代码创建了一个JSON:
$start = {
Clear-Host
$BIB = Read-Host 'Bibliothek'
$BIBName = Read-Host 'Bibliothek Name'
$Standort = Read-Host 'Bibliothek Standort'
$Autor = Read-Host 'Buchautor'
$BuchName = Read-Host 'Buchname'
$jsonfile = "C:\Skripte\bibV2-1000.xml"
if(![System.IO.File]::Exists($jsonfile)){
$Data = @{BIBs = @(
@{$BIB = @{BIBName=$BIBName},
@{Standort = $Standort},
@{Bücher = @(
@{BuchName = $BuchName;
Autor = $Autor})
}}
)}
ConvertTo-Json -Depth 50 -InputObject $Data | Add-Content $jsonfile
.$continue
} else {
$jsonfile = "C:\Skripte\bibV2-1000.json"
$Data = Get-Content $jsonfile | ConvertFrom-Json
$Data.BIBs += New-Object -TypeName psobject -Property @{$BIB =
@{BIBname=$BIBName},
@{Standort=$Standort},
@{Bücher = @(@{
Buchname=$BuchName;
Autor=$Autor})
}
}
ConvertTo-Json -Depth 50 -InputObject $Data | Out-File $jsonfile}
.$continue
}
$continue = {
Write-Host ""
Write-Host "Was wollen Sie machen?"
Write-Host "(1) Eine weitere Bibliothek hinzufügen"
Write-Host "(2) Einer Bibliothek neue Bücher hinzufügen"
Write-Host "(E) Script beenden"
If (($read = Read-Host ) -eq "1") {
&$start} else {
if (($read) -eq "2") {
. C:\Skripte\büc.ps1 } else {
if (($read) -eq "E") {
exit} else {
Write-Host "+++ FALSCHE EINGABE! Bitte wählen Sie (1) oder (2) für die entsprechende Aktion +++"
.$continue
}
}
}
}
&$start
输出如下:
{
"BIBs": [{
"BIB1": [{
"BIBName": "123"
},
{
"Standort": "123"
},
{
"Bücher": [{
"Autor": "123",
"BuchName": "123"
}]
}
]
},
{
"BIB2": [{
"BIBname": "345"
},
{
"Standort": "345"
},
{
"Bücher": [{
"Autor": "345",
"Buchname": "345"
}]
}
]
}
]
}
现在我想找出" BIB1"的索引。我已经尝试过IndexOf() - 方法,它应该创建输出" 0"但它给了我" -1"相反,因为它无法找到价值。如何获得" BIB1"?
的索引答案 0 :(得分:2)
根据您的earlier question判断,您正在尝试获取特定对象的索引,以便您可以通过其包含的数组访问 。但是,您可以更直接地执行此操作:$objOfInterest = $Data.BIBs | ? BIB1
- 有关详细信息,请参阅我的answer to your earlier question。
您需要遍历$Data.BIBs
的数组元素,在使用ConvertFrom-Json
读取序列化到文件的JSON哈希表时 - 是自定义对象(正如Ansgar正确指出的那样;它们是[System.Management.Automation.PSCustomObject]
的实例),并检查每个是否存在属性 'BIB1'
:
(在哈希表中,您将使用'BIB1'
检查是否存在键 .ContainsKey('BIB1')
要测试对象属性的存在,您需要 reflection ,这是最容易 - 但有些模糊 - 通过隐藏的{{1}实现} {,如Ansgar Wiechers' more elegant solution中所示。
但是,假设感兴趣的属性具有非空值,我们可以使用隐式布尔(逻辑)推断存在给定属性存在的非空值:.PSObject
如果没有$obj.'BIB1'
属性,则默认返回$null
,在布尔上下文中为“falsy”,例如BIB1
条件;相反,任何非空的价值都是“真实的”:
if
答案 1 :(得分:2)
$Date.BIBs
是一个自定义对象数组,而不是哈希表(因为您将原始数据写入JSON文件然后将其转换回来),所以你需要这样的东西:
$arr = $Data.BIBs | ForEach-Object { $_.PSObject.Properties.Name }
$arr.IndexOf('BIB1') # returns 0
$arr.IndexOf('BIB2') # returns 1