当我只知道上一个值时,如何使用 jq 检索下一个键值对 [duplicate]

How to retrieve the next key value pair with jq when I know the previous value only [duplicate]

提问人:bessey 提问时间:11/17/2023 最后编辑:tripleeebessey 更新时间:11/17/2023 访问量:54

问:

如果我知道 JSON 文件中的上一个值,我想检索下一个键值对,如下所示:

{
   "metadata":{
      "secretSchema":"3.0",
      "tenant":"MyTenantName"
   },
   "globalSecrets":[
      {
         "secretName":"secretName1",
         "secretValue":"secretValue1"
      },
      {
         "secretName":"secretName2",
         "secretValue":"secretValue2"
      },
      {
         "secretName":"secretName3",
         "secretValue":"secretValue3"
      },
      {
         "secretName":"secretName4",
         "secretValue":"secretValue4"
      },
      {
         "secretName":"secretName5",
         "secretValue":"secretValue5"
      },
      {
         "secretName":"secretName6",
         "secretValue":"secretValue6"
      },
      {
         "secretName":"secretName7",
         "secretValue":"secretValue7"
      }
   ]
}

我只知道 secretValue5 的值,并想检索 secretName5 值和下一个值(secretName6 secretValue6 )

我尝试了以下命令:

.globalSecrets[] | to_entries | while(. != []; .[1:])[:2] | select(first.value == "secretValue5") | first.key, first.value, last.key, last.value

但结果是

secretValue
secretValue5
secretValue
secretValue5

预期的结果是

secretName5
secretValue5
secretName6
secretValue6

我在这篇文章中发布了一个类似的问题,但使用另一个带有上述命令的 JSON 文件,它工作正常,但不是来自上面的 JSON 文件。

JSON JQ

评论

0赞 Inian 11/17/2023
您是否尝试过此答案 - stackoverflow.com/a/77484449/5291015 和 jq 播放片段似乎表明它工作正常
0赞 Inian 11/17/2023
您也许应该删除这个问题,对上一个问题发表评论(对于接受的答案),并要求更新您的新 JSON 结构。重复没有实际答案值的问题是没有用的
0赞 pmf 11/17/2023
尽管主题是相似的(这个问题实际上是一个导数),但前一个问题是询问对象中的下一个键值对,而这是关于数组中的下一个项目。对我来说,这是一个实质性的区别(尤其是关于一个物体的物品是否具有顺序的问题),因此不是重复的。

答:

1赞 pmf 11/17/2023 #1

这是基于之前的方法,即在对象中查找下一个键值对。然而,在当前情况下,问题在于如何查找数组中的下一个项目(与前一种情况相反,它具有明确的顺序),而数组项目是对象,输出是找到的对象的两个值(而不是它们的键值对)。因此,您不需要 ,因此不需要对 或 的任何引用。只需直接处理数组及其项的字段(和):to_entries.key.value.globalSecrets.secretName.secretValue

.globalSecrets | while(. != []; .[1:])[:2]
| select(first.secretValue == "secretValue5")
| first.secretName, first.secretValue, last.secretName, last.secretValue
secretName5
secretValue5
secretName6
secretValue6

演示

评论

0赞 bessey 11/17/2023
非常感谢这个快速的解决方案,这正是我所需要的。