通过 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
}
}
我不确定如何正确命名这些元素,只是显示它会更容易。我有以下 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
}
}