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

时间:2018-07-30 11:03:26

标签: json powershell powershell-v4.0

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

import sys

from _winreg import *

# tweak as necessary
version = sys.version[:3]
installpath = sys.prefix

regpath = "SOFTWARE\\Python\\Pythoncore\\%s\\" % (version)
installkey = "InstallPath"
pythonkey = "PythonPath"
pythonpath = "%s;%s\\Lib\\;%s\\DLLs\\" % (
    installpath, installpath, installpath
)

def RegisterPy():
    try:
        reg = OpenKey(HKEY_CURRENT_USER, regpath)
    except EnvironmentError as e:
        try:
            reg = CreateKey(HKEY_CURRENT_USER, regpath)
            SetValue(reg, installkey, REG_SZ, installpath)
            SetValue(reg, pythonkey, REG_SZ, pythonpath)
            CloseKey(reg)
        except:
            print ("*** Unable to register!")
            return
        print ("--- Python", version, "is now registered!")
        return
    if (QueryValue(reg, installkey) == installpath and
        QueryValue(reg, pythonkey) == pythonpath):
        CloseKey(reg)
        print ("=== Python", version, "is already registered!")
        return
    CloseKey(reg)
    print ("*** Unable to register!")
    print ("*** You probably have another Python installation!")

if __name__ == "__main__":
    RegisterPy()

我想通过提供电子邮件获得“ DEV”。如何在Powershell中实现它?

3 个答案:

答案 0 :(得分:2)

如下所示可以帮助您-

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

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

答案 1 :(得分:1)

我不知道有什么优雅的方法。 ConvertFrom-Json不会像使用convertfrom-xml这样的简单方法来创建整洁的对象来遍历它们,相反,结果只是带有一堆noteproperties的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

不漂亮,不是真正可重用,但可以。 如果有人知道更好的解决方法-我将很高兴学习它:)

答案 2 :(得分:1)

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

鉴于您的json存储在变量$json中:

您可以使用$json.psobject.properties.name获取每个head对象:

输入:

$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
  }
}