我正在尝试使用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属性。
因此,如果我知道prop键,它将是:
nodes.oTUltX4IQMOUUVeiohTt8A.tasks.oTUltX4IQMOUUVeiohTt8A:124.id
如何在不事先知道密钥的情况下访问此值?
任何帮助非常感谢。
谢谢尼克
以下代码定义并使用 functionGet-FirstPropertyValue
,该 函数 对具有给定名称的对象图内的第一个属性
执行 深度优先 的 递归搜索 ,并假设其值为非null:
# 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
一个 更简洁但更晦涩且可能更慢的替代方法 是 将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 }
问题内容: 我试图在PowerShell中遍历以下JSON文件。 如果没有专门命名顶部标签(例如17443和17444),由于我事先不知道它们的名称,就无法找到遍历数据的方法。 我想为所有记录输出标签3、4和5(标题,名字,姓氏)。 我该怎么做? 我可以使用下面的代码访问数据,但我想避免放入17443、17444等。 问题答案: 在PowerShell 3.0及更高版本中(请参阅:确定已安装的Po
问题内容: 我有一个可以用SwiftyJSON解析的json: 完美运作。 但是我无法遍历它。我尝试了两种方法,第一种是 XCode不接受for循环声明。 第二种方法: XCode不接受if语句。 我究竟做错了什么 ? 问题答案: 如果要遍历数组,请尝试: 至于第二种方法,返回 非 数组,应该使用:
问题内容: 我的PHP代码: 虽然它适用于非数组,但我终生无法弄清楚如何打印“审阅”数组中的所有值。 我想做的是遍历此响应,可能使用forreach(),从而得到一个包含响应中每个评论的评分和摘要的列表。 任何指导/方向将不胜感激。 以下是我正在使用的JSON。(这是Yelp API的响应)。 问题答案: 您可能会遇到麻烦,因为评论是一个数组,并且您试图将其作为JSON对象进行访问。
问题内容: 我有一个需要迭代的JSON文件,如下所示… 数据中的键并不总是相同的(我只是使用示例,有20个不同的键),因此,我无法设置脚本来静态引用它们以获取值。 否则我可以说 过去我在数据节点上使用了一个简单的foreach循环… 但是不想阻止脚本。有任何想法吗? 问题答案: 您可以通过以下方式遍历JavaScript对象: myobject可能是您的json.data
问题内容: 我有一个Ruby代码块,如下所示: 这样会产生多种回报: 我想遍历它并提取各种元素。我努力了 错误是: 解决这些难题的最佳方法是什么? 问题答案: 我有解决方案,希望对您有所帮助。我花了数小时的摆弄和实验。这里是: 重要的事情似乎是将elasticsearch结果转换为红宝石友好的东西。
问题内容: 如何使用CodeIgniter在以下JSON中遍历并显示名称? 问题答案: 1)是一个字符串,您需要首先对其进行解码。 2)您需要遍历对象并获取其成员