【问题标题】:Get value by the array element name in json通过json中的数组元素名称获取值
【发布时间】:2019-01-06 14:53:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: json powershell powershell-4.0


    【解决方案1】:

    以下内容可以提供帮助 -

    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.psobject.Properties 如果你这样做 $json|get-member - 它没有显示 $json 对象具有 psobject 属性或方法.它是一种什么样的财产?
    • 在 JSON 被转换之后,如果你查看它的类型,$json.GetType(),你会注意到它是从System.Object 基类派生的PSCustomObject。所有PS custom objects 都将具有PSObject.Properties 属性,因为它再次派生自System.Management.Automation 命名空间。有关详细信息,请参阅the corresponding msdn link
    【解决方案2】:

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

    假设您的 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
      }
    }
    

    【讨论】:

      【解决方案3】:

      我不知道有什么优雅的方法。 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
      

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

      【讨论】:

      • 您在代码中缺少 }。但是我选择另一个作为获胜者,因为它是单线解决方案
      • 谢谢。已将缺少的 } 添加到我的答案中。我同意您选择的答案更好。从现在开始我也会使用它:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多