通过 json 中的数组元素名称获取值

Get value by the array element name in json

我不确定如何正确命名这些元素,只是显示它会更容易。我有以下 JSON:

{
  "DEV": [
    {
      "GitEmail": "asd@asd.com"
    }
  ],
  "TEST": [
    {
      "GitEmail": "asd1@asd.com"
    }
  ],
  "PROD": [
    {
      "GitEmail": "asd2@asd.com"
    }
  ]
}  

我想通过提供电子邮件来获取 "DEV"。如何在 powershell 中实现?

我不知道有什么优雅的方法可以做到这一点。 ConvertFrom-Json 不会像 convertfrom-xml 那样用简单的方法创建简洁的对象来遍历它们,相反结果只是一个带有一堆音符属性的 PsObject。
我在这种情况下所做的是

    $a= @"
{
  "DEV": [
    {
      "GitEmail": "asd@asd.com"
    }
  ],
  "TEST": [
    {
      "GitEmail": "asd1@asd.com"
    }
  ],
  "PROD": [
    {
      "GitEmail": "asd2@asd.com"
    }
  ]
}  
"@
$JsonObject= ConvertFrom-Json -InputObject $a 
$NAMES= $JsonObject|Get-Member |WHERE MemberType -EQ NOTEPROPERTY
$NAMES|Foreach-Object {IF($JsonObject.$($_.NAME).GITEMAIL -EQ 'asd@asd.com'){$_.NAME}}

以上结果为

DEV

不漂亮,不能真正重复使用,但可以用。 如果有人知道更好的方法 - 我会很乐意学习它:)

类似下面的内容可以提供帮助 -

PS> $json = '{
  "DEV": [
    {
      "GitEmail": "asd@asd.com"
    }
  ],
  "TEST": [
    {
      "GitEmail": "asd1@asd.com"
    }
  ],
  "PROD": [
    {
      "GitEmail": "asd2@asd.com"
    }
  ]
}' | ConvertFrom-Json

PS> ($json.psobject.Properties | ? {$_.Value -match "asd@asd.com"}).Name

根据电子邮件匹配,您可以检索环境名称。

我不能保证有更简单的方法,但这是一种方法:

假设你json存储在一个变量$json:

你可以通过 $json.psobject.properties.name:

获取每个头部对象

输入:

$json.psobject.properties.name

输出:

DEV
TEST
PROD

有了这个,我们可以创建一个 foreach 循环并搜索电子邮件:

foreach ($dev in $json.psobject.properties.name)
{
  if($json.$dev.GitEmail -eq "asd@asd.com") {
    echo $dev
  }
}