如何使用 Powershell 遍历 JSON 属性

2023-12-13

我正在尝试使用 Powershell 访问 JSON 对象的特定属性值。不幸的是,我不知道结构中某些父属性的键,因此我无法以直接的方式执行此操作。此外,由于 JSON 不是数组,我无法通过索引位置访问。

上下文是我正在从 elasticsearch 查询正在运行的任务列表,并且需要获取任务的 ID(我知道只会有一个),以便我可以进行后续调用以发现其完成状态。

我研究了一些查询方法,但不确定如何应用它们(PowerShell 语法对我来说相当新)。

我正在使用的 JSON 响应如下所示;

  "nodes" : {
    "oTUltX4IQMOUUVeiohTt8A" : {
      "name" : "H5dfFeA",
      "transport_address" : "127.0.0.1:9300",
      "host" : "127.0.0.1",
      "ip" : "127.0.0.1:9300",
      "tasks" : {
        "oTUltX4IQMOUUVeiohTt8A:124" : {
          "node" : "oTUltX4IQMOUUVeiohTt8A",
          "id" : 124,
          "type" : "direct",
          "action" : "cluster:monitor/tasks/lists[n]",
          "start_time_in_millis" : 1458585884904,
          "running_time_in_nanos" : 47402,
          "cancellable" : false,
          "parent_task_id" : "oTUltX4IQMOUUVeiohTt8A:123"
        }
      }
    }
  }
}

通过这个给定的结构,我希望能够访问第一个“任务”的 ID 属性。

所以如果我知道道具键它将是:

nodes.oTUltX4IQMOUUVeiohTt8A.tasks.oTUltX4IQMOUUVeiohTt8A:124.id

在事先不知道密钥的情况下如何访问该值?

非常感谢任何帮助。

谢谢 缺口


以下代码定义并使用功能Get-FirstPropertyValue,它执行递归、深度优先搜索对象图中具有给定名称的第一个属性并返回其值,假设该值非空:

# Function that returns the value of the first property with the given 
# name found during recursive depth-first traversal of the given object.
# Note that null-valued properties are ignored.
function Get-FirstPropertyValue($obj, $propName) {
  $propNames = $obj.psobject.properties.Name
  if ($propName -in $propNames) {
    $obj.$propName
  } else {
    foreach ($iterPropName in $propNames) {
        if ($null -ne ($val = Get-FirstPropertyValue $obj.$iterPropName $propName)) {
          return $val
        }
      }
  }
}

# Input JSON
$json = @'
{
    "nodes": {
        "oTUltX4IQMOUUVeiohTt8A": {
            "name": "H5dfFeA",
            "transport_address": "127.0.0.1:9300",
            "host": "127.0.0.1",
            "ip": "127.0.0.1:9300",
            "tasks": {
                "oTUltX4IQMOUUVeiohTt8A:124": {
                    "node": "oTUltX4IQMOUUVeiohTt8A",
                    "id": 124,
                    "type": "direct",
                    "action": "cluster:monitor/tasks/lists[n]",
                    "start_time_in_millis": 1458585884904,
                    "running_time_in_nanos": 47402,
                    "cancellable": false,
                    "parent_task_id": "oTUltX4IQMOUUVeiohTt8A:123"
                }
            }
        }
    }
}
'@

# Convert the JSON to a [pscustomobject] graph with ConvertFrom-Json.
$objFromJson = $json | ConvertFrom-Json

# Using the function defined above, get the first 'tasks' object found
# during recursive depth-first traversal.
$tasks = Get-FirstPropertyValue $objFromJson 'tasks'

# Get the name of the resulting object's first property.
$propName = @($tasks.psobject.properties.Name)[0]

# Extract the .id property from the object stored in the first property.
$tasks.$propName.id

上面的结果是:

124

A 更简洁,但更晦涩且可能更慢的替代方案 is to 将 JSON 输入转换为 XML,然后使用XPath查询它:

# Input JSON
$json = @'
{
    "nodes": {
        "oTUltX4IQMOUUVeiohTt8A": {
            "name": "H5dfFeA",
            "transport_address": "127.0.0.1:9300",
            "host": "127.0.0.1",
            "ip": "127.0.0.1:9300",
            "tasks": {
                "oTUltX4IQMOUUVeiohTt8A:124": {
                    "node": "oTUltX4IQMOUUVeiohTt8A",
                    "id": 124,
                    "type": "direct",
                    "action": "cluster:monitor/tasks/lists[n]",
                    "start_time_in_millis": 1458585884904,
                    "running_time_in_nanos": 47402,
                    "cancellable": false,
                    "parent_task_id": "oTUltX4IQMOUUVeiohTt8A:123"
                }
            }
        }
    }
}
'@

$parent = 'tasks'
$prop = 'id'
$propType = 'int'

$json | 
  ConvertFrom-Json |
    ConvertTo-Xml -Depth ([int]::MaxValue) | 
      Select-Xml "//Property[@Name='$parent']/*/*[@Name='$prop']/text()" |
        ForEach-Object { $_.Node.InnerText -as $propType }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Powershell 遍历 JSON 属性 的相关文章

随机推荐

  • 将字体导入 GUI

    除了 swing 似乎附带的基本 5 种字体之外 我正在尝试更改 GUI 的字体 如何导入字体并在我的代码中实际使用它们 默认情况下通常有 5 个以上可用 但它们会因系统而异 该答案检查现有字体 以及如何加载和注册新字体 它使用 Airac
  • Java 的迁移[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我使用 ruby on Rails 和 Java 当我从事 Rails 项目时 我真的很喜欢使用迁移 所以我想知道是否有类似 Java 的迁移工具
  • 我应该为 Selenium By.XPATH 导入什么?

    新版本的 Selenium 没有任何旧方法 例如 find element by xpath 但它引入了新的 fabrique 方法 find element By XPATH searched string 这是来自的示例文档 veget
  • 多种语言一起编译

    是否可以将多种语言一起编译 以便充分利用不同语言的优点 绝对有可能link如果编译器和链接器全部兼容 则在单独编译它们之后将它们放在一起 如果适当编程 例如 g77 c one f gcc c two c gcc o together on
  • 可变参数模板异构容器

    我需要使用异构元素实现一些可变模板容器类 它允许迭代这些元素 我的第一个想法是使用带有可变参数的 std tuple 成员创建类 但是通过类似数组的方式 通过循环 从元组获取元素是不可能的 struct A void prnt std co
  • 如何在 VB6 中使用 MSHTML 解析器去除所有 HTML 标签?

    如何在 VB6 中使用 MSHTML 解析器去除所有 HTML 标签 这是改编自 CodeGuru 的代码 非常感谢原作者 http www codeguru com vb vb internet html article php c481
  • WriteFile 返回错误 1784

    我正在创建一个程序来使用虚拟文件系统填充磁盘 目前 我正在使用编写可变大小的文件WriteFile WriteFile hFile FileData i 1024 dwWrote NULL err GetLastError 错误返回 178
  • 防止WebView显示“网页不可用”

    我有一个广泛使用 WebView 的应用程序 当此应用程序的用户没有互联网连接时 会出现一个页面 显示 网页不可用 和各种其他文本 有没有办法不在我的 Web 视图中显示此通用文本 我想提供我自己的错误处理 private final Ac
  • LINQ to Entities 无法识别“System.DateTime Parse(System.String)”方法

    我是 Linq 的新手 下面的查询不断返回 无法识别 System DateTime 错误 我尝试过解析和转换 但都不起作用 这是我的查询 mrcEntities 上下文 GetContext var query from c in con
  • 将自定义产品排序设置为默认 Woocommerce 排序选项

    在 Woocommerce 中 我使用以下代码按修改日期向商店目录添加自定义排序选项 add filter woocommerce get catalog ordering args enable catalog ordering by m
  • 单独的日期和时间对象

    我有一个网络表单 用户可以从日历弹出窗口中选择日期 从下拉列表中选择时间 目前我正在尝试使用 Date 对象存储日期 Required public Date date 该对象的输出类似于 1970 年 1 月 1 日 00 00 00 G
  • 发布附件 Facebook Graph API

    现在我正在尝试弄清楚如何使用 facebooks graph api 发布附件 现在我正在使用 attachment array message gt POST tt text gt Download name gt name href g
  • 如何将 long 转换为字符串?

    我需要将很长的推文 ID 转换为字符串 例如 我有 id 39685855740174336 But var dump id prints float 3 9685855740174E 16 我尝试使用获取字符串值strval var du
  • T-SQL - 接收两个数字之间的差距

    我正在使用 SQL Server 2012 我收到了 最大数量 f e 201900005 这告诉我范围从 201900000 开始 这是给定的 现在我想收到这个范围内缺少的数字 我已经查看了几个与此相关的问题 但我似乎无法让它发挥作用 通
  • 正在进行的赋值语句的效率是多少-4gl

    为什么使用赋值语句比不使用赋值更有效 同事们说 assign a 3 v 7 w 8 比以下方法更有效 a 3 v 7 w 8 why 你总是可以自己测试一下 但是 是的 它的效率稍微高一些 或者这是我最后一次测试它 原因是编译器合并了语句
  • jQuery 单击单元格更改为文本框

    我一直在 Google 和 StackOverflow 上查找 但到目前为止还没有找到我想要的东西 如果有人能指出我正确的方向 那就太好了 我有一张 5 行的表 tr th class table check cell th tr
  • 具有大量控件的假滚动容器

    我正在尝试优化 FlowLayoutPanel 的填充和滚动 但我之前遇到过类似控件的问题 如果它们内部有太多控件 则容器需要很长时间才能填充并准备使用 并且滚动条变得越来越短 您可能对此很熟悉 我读过 您可以使用容器矩形可见边界内的控件池
  • 使用 Lambda 和元组发送到多个函数:Python、Tkinter

    column1 H Hydrogen Atomic 1 nAtomic Weight 1 01 nState Gas nCategory Alkali Metals Li Lithium Atomic 3 nAtomic Weight 6
  • 无法在 Java 中加载属性文件

    我正在尝试加载属性文件 属性文件位于应用程序的类路径中 Properties p new Properties p load new FileInputStream classpath mail properties System out
  • 如何使用 Powershell 遍历 JSON 属性

    我正在尝试使用 Powershell 访问 JSON 对象的特定属性值 不幸的是 我不知道结构中某些父属性的键 因此我无法以直接的方式执行此操作 此外 由于 JSON 不是数组 我无法通过索引位置访问 上下文是我正在从 elasticsea