如何在PowerShell中遍历JSON数据结构?

ThinkCode

我是PowerShell的新手,从Python背景中即时学习它。

我从另一个工具中提取数据,该工具通过REST调用检索数据。

METERS变量以这种格式存储在源代码中。

{
    "500 HR": 500,
    "1000 HR": 1000,
    "2000 HR": 2000
}

PowerShell代码

#REST call to source
$meter=@{}
Foreach ($item in $origresult.Items)  {
$result = (Invoke-RestMethod -Uri $url  -Headers $headers -Method GET -ContentType application/json -ErrorVariable RespErr)
$meter.Add($item.Name,$result.Value)
}
Write-Host ($meter | Out-String) -ForegroundColor Red

这是输出

Name                           Value
----                           -----
LastUploaded                   2020-12-29T06:38:02
IsEnabled                      1       
METERS                         {...
ORGID                          WHS

如何检索METERS并遍历字典?到目前为止,我已经尝试过了。Python用其简单的数据结构宠坏了我,PowerShell并不是那么简单,除非有更简单的方法来做到这一点。

$mymeters = $meter.METERS | ConvertFrom-Json
Write-Host ($mymeters | Out-String) -ForegroundColor Yellow

输出量

500 HR   : 500
1000 HR  : 1000
2000 HR  : 2000

到目前为止,我已经尝试过一些方法-

$mymeters = [ordered]@{}
" Here is the item $mymeters.Get_Item(500 HR)" #my silly attempt!
# Looping is a no go either - it says specialized ordered dictionary
foreach ($ind in $mymeters) {
" --> $ind"
}

输出量

 Here is the item System.Collections.Specialized.OrderedDictionary.Get_Item(500 HR)
 --> System.Collections.Specialized.OrderedDictionary

我可能缺少一些真正的基本知识,但我无法自己弄清楚!任何帮助都非常感谢。我想要的只是遍历METERS哈希表/字典并调用一个函数。

Mathias R. Jessen

在深入探讨它之前,让我们回顾一些PowerShell语法基础知识,看看我们是否可以重用您的一些Python直觉:)

会员访问

就像在Python中一样,您可以使用成员访问运算符名称引用对象的属性.-对于非连续名称,请使用引号:

$mymeters = $meter.METERS | ConvertFrom-Json
$mymeters.'500 HR'  # evaluates to `500`

字符串表达式

PowerShell中的字符串文字有两种截然不同的风格:

  • 单引号字符串('Hello World!'
    • 这些是逐字字符串文字,并且唯一受支持的转义序列是''(文字单引号)
  • 双引号字符串("Hello World!"
    • 这些都是可扩展的字符串常量-自动插入$variable标记和$()将出现的子表达式,除非明确地逃脱了-`是转义字符,而且你在大多数类似C语言(预计通用序列`n`t`r,等)本身的认可。

但是,任意表达式(如$dictionary.get_Item('some key')不会按原样求值。

为了解决这个问题,我们可以使用-f字符串格式运算符:

$mymeters = [ordered]@{}
"Here is item '500 HR': {0}" -f $mymeters['500 HR']

-f如果您曾经使用过Python3的f字符串,应该会感到很熟悉,但需要注意-PowerShell的-f运算符是薄包装String.Format(),并且String.Format() 支持基于0的占位符-'{0} {1}' -f 1,2有效,但'{} {}' -f 1,2无效。

另一个选择是将表达式包装在$()双表达式字符串文字内的子表达式运算符中:

$mymeters = [ordered]@{}
"Here is item '500 HR': $($mymeters['500 HR'])"

请注意,PowerShell中的字典支持使用[]-进行Python的键控索引访问


与Python一样,PowerShell(通常也包括.NET)也具有强大的自省功能。

动态发现和迭代任何对象的属性就像引用一个名为的特殊成员一样简单psobject

foreach($propertyMetadataEntry in $someObject.psobject.Properties){
    "Property: {0,-20} = {1}" -f $propertyMetadataEntry.Name,$propertyMetadataEntry.Value
}

或您的情况:

$mymeters = $meter.METERS | ConvertFrom-Json
foreach($meterReading in $mymeters.psobject.Properties){
    "Meter: {0,-20} = {1}" -f $meterReading.Name,$meterReading.Value

    # do whatever else you please with $meterReading here :)
}

这将适用于任何标量对象(如ConvertFrom-Json返回的对象Invoke-RestMethod)。

要遍历字典中的条目,您需要显式调用.GetEnumerator()

$dictionary = [ordered]@{ A = 1; B = 2; C =3 }
foreach($keyValuePair in $dictionary.GetEnumerator()){
    "Dictionary Entry: {0} = {1}" -f $keyValuePair.Key,$keyValuePair.Value
}

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 C# 中解析嵌套的 JSON 数据结构

如何在MATLAB中实现动态大小的数据结构?

如何在NoSQL环境中创建以下数据结构

如何在Java中创建链接列表数据结构?

如何在JavaScript中创建数据结构?

如何在PHP中创建类似数据结构的集合?

在PowerShell中设置(数据结构)

我如何深入遍历类似JSON的数据结构以返回总值

在C ++中,当在源文件中定义数据结构时,如何在头文件中声明数据结构?

在ReactJS中,当遍历非浅层数据结构时,如何最好地组织代码

如何使用不同的数据结构递归遍历地图

MessagePack C++ - 如何遍历未知数据结构?

JSON数据结构中的文件路径

Go中的任意JSON数据结构

在不相交的集合数据结构中遍历类

如何在Go中获取包含数据结构的结构的大小?

在Powershell中遍历JSON数据

如何在java中请求锁定数据结构的数据

如何在Karate中为数据驱动的测试准备嵌套的数据结构?

如何在 React 中检查此导入数据的数据结构

如何在python中访问复杂数据结构中的某些元素

可遍历内存池的数据结构

在Google Apps脚本中,如何让一个函数遍历跟踪多个不同变量对的数据结构?

如何使用集合或集合在 Java 中的数据结构中组织数据结构?

在Typescript中定义数据结构以存储此JSON数据

如何在 Ajax 中获取符合数据结构的 Django 查询集?

如何在go中返回大型数据结构的唯一元素?

如何在ghci中调用具有特定数据结构的函数

如何在Python中确定嵌套数据结构的类型?