如何使用Powershell从json属性获取键值对

柯达曼

我被困在如何动态地从json文件中获取键值对的含义,而无需事先知道键值。

我有这个样本json文件,在实际的应用程序中,我有大约20个json文件以及数千个自动测试用例:

{
    "runOnMachines": "SERVER-01",
    "cases": [
    {
        "testName": "Google Chrome Install 84.0.4147.89",
        "testDescription": "Verifies Google Chrome is Installed 84.0.4147.89",
        "testFunction": "Find-ProgramVersion",
        "args": [
          {
            "programName" : "Firefox",
            "version"     : "79.0"
          }
        ],
        "expectedResult": "true"
      },
      {
        "testName": "Tera Term 4.105",
        "testDescription": "Tera Term 4.105",
        "testFunction": "Find-ProgramVersion",
        "args": [
          {
            "programName" : "Tera Term",
            "version"     : "4.105"     
          }
        ],
        "expectedResult": "true"
      }
    ]
}

Find-ProgramVersion是一个辅助函数,用于搜索控制面板中安装的程序/通过注册表安装的程序,它返回true或false。(有关这方面的更多信息,Winster是我用来测试服务器上虚拟机的自动化框架的一部分。

长话短说,我有这个丑陋的代码,我想清理,但我找不到如何从json文件动态提取我的args的方法。到目前为止,我在Winster模块上编写的每个函数都必须使用此脚本,并使用正确的json属性手动添加。

if($jsonData[$i].testFunction -eq "Find-ProgramVersion")
{
    $command = $jsonData[$i].testFunction + " " + $jsonData[$i].args.programName + " " + 
    $jsonData[$i].args.version
}

if($jsonData[$i].testFunction -eq "Find-ProgramVersionGrep")
{
    $command = $jsonData[$i].testFunction + " " + $jsonData[$i].args.programName + " " + 
    $jsonData[$i].args.version
}

我尝试过转换jsonData[$i].args为数组,也尝试过使用PsObject.Properties中的Name和Value,但这也提供了我不需要从PsObject继承的其他值


for($i=0; $i -lt $jsonData.Count; $i++)
{ 
    $jsonData[$i].args.PSObject.Properties | ForEach-Object {
        $_.Name
        $_.Value
    }
}

给我:

Count
1
Length
1
LongLength
1
Rank
1
SyncRoot

programName version
----------- -------
Firefox     79.0   
IsReadOnly
False
IsFixedSize
True
IsSynchronized
False
Count
1
Length
1
LongLength
1
Rank
1
SyncRoot
Tera Term   4.105  
IsReadOnly
False
IsFixedSize
True
IsSynchronized
False

我希望从jsonData [$ i] .args中得到的结果是某种可迭代的,可以在其中使用forloop,但是我无法使下面的PsObject可用。而且,由于某些函数具有不同数量的arg,因此无需事先知道args的名称。

@{programName=Firefox; version=79.0} @{programName=Tera Term; version=4.105}
mklement0
(@'
{
  "runOnMachines": "SERVER-01",
  "cases": [
  {
      "testName": "Google Chrome Install 84.0.4147.89",
      "testDescription": "Verifies Google Chrome is Installed 84.0.4147.89",
      "testFunction": "Find-ProgramVersion",
      "args": [
        {
          "programName" : "Firefox",
          "version"     : "79.0"
        }
      ],
      "expectedResult": "true"
    },
    {
      "testName": "Tera Term 4.105",
      "testDescription": "Tera Term 4.105",
      "testFunction": "Find-ProgramVersion",
      "args": [
        {
          "programName" : "Tera Term",
          "version"     : "4.105"     
        }
      ],
      "expectedResult": "true"
    }
  ]
}
'@ | ConvertFrom-Json).cases | ForEach-Object {
  $_.testFunction + ' ' + (
    $_.args.ForEach( { 
        $_.PSObject.Properties.Value.ForEach( {
            if ($_.contains(' ')) {
              # contains spaces -> double-quote
              '"{0}"' -f $_
            }
            else {
              $_
            }
          })
      })
  ) -join ' '
}

以上返回以下内容:

Find-ProgramVersion Firefox 79.0
Find-ProgramVersion "Tera Term" 4.105

如果嵌入的 "char有值,则需要做更多的工作

  • $_.args.ForEach遍历args数组的所有元素

  • $_.PSObject.Properties.Value.ForEach 遍历每个元素的所有属性值。

  • $_.contains(' ')测试每个属性值是否存在至少一个空格字符,在这种情况下,该值用'"{0}"' -f $_正在构造的整个命令行中的双引号(括起来(通过使用带有空格的值构成的字符串-join ' ')。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从嵌套的JSON获取键值?

来自分类Dev

如何使用可变键遍历json并获取键值?

来自分类Dev

如何使用Powershell遍历JSON属性

来自分类Dev

如何从JSON对象获取匹配的键值?

来自分类Dev

如何使用javascript获取json对象属性

来自分类Dev

如何使用Spring在运行时从属性文件获取键值

来自分类Dev

如何使用Java包获取所有属性文件并更新键值?

来自分类Dev

如何使用Spring注入键值属性文件?

来自分类Dev

如何在Servlet中使用属性键值

来自分类Dev

如何使用.get()获取嵌套的字典键值

来自分类Dev

如何使用php从对象获取数组键值

来自分类Dev

从JSON对象获取键值

来自分类Dev

获取 JSON 键值

来自分类Dev

无法从 json 获取键值

来自分类Dev

如何使用键值数组遍历JSON数据

来自分类Dev

如何使用 Javascript 搜索特定的 JSON 键值对?

来自分类Dev

获取和设置键值属性

来自分类Dev

如何使用PowerShell从JSON响应中获取单个值

来自分类Dev

如何从节点js中的Json对象获取键值

来自分类Dev

如何从响应对象获取特定的 json 键值

来自分类Dev

如何从节点js中的json结果中获取键值

来自分类Dev

如何在 JavaScript 中获取 JSON 的键值对之一的值?

来自分类Dev

如何使用通过.Net PowerShell对象运行的PowerShell脚本获取Windows注册表属性值?

来自分类Dev

使用Property Mediator时如何获取json属性?

来自分类Dev

使用Angular从键值数组中获取JSON值

来自分类Dev

使用Angular从键值数组中获取JSON值

来自分类Dev

如何获取json属性内容

来自分类Dev

如何获取数组的键值和键值对

来自分类Dev

如何获取键值数组中的键值

Related 相关文章

热门标签

归档