当我知道上一个键值对时,如何使用 jq 检索 json 文件中的下一个键值对

How to retrieve the next key value pair in a json file with jq when I know the previous one

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

问:

我有以下JSON文件:

{
   "entry1":"",
   "entry2":"",
   "entry3":"value3",
   "entry4":"value4",
   "entry5":"",
   "entry6":" ",
   "entry7":"",
   "entry8":"false"
}

我知道 entry3 的键值对,但不知道下一个键值对(entry4 和 value)。 如何访问它们?

目前,我被困在以下命令上:

jq -r 'to_entries[] | select(.value == "value3") | .key, .value'
JSON JQ

评论

2赞 Inian 11/14/2023
JSON 规范不保证对象中键/值对的顺序。因此,根据定义,不必紧随其后。虽然数组可以包含值的有序列表"entry4""entry3"

答:

1赞 pmf 11/14/2023 #1

您可以再次使用(作用于数组),在这种情况下,您将获得数字作为字段中的索引。使用 进行过滤,然后递增结果,并通过直接索引获取该项目:to_entries.keyselect.key.[n]

to_entries | .[
  to_entries[] | select(.value.value == "value3").key + 1
] | .key, .value
entry4
value4

演示

请注意,JSON 对象中的条目在语义上没有顺序,即任何其他排序都将被视为同一对象。 只是按表示顺序返回项目,这是您要查询的内容,请注意,严格来说,这条信息不是 JSON 输入传达的数据的一部分。to_entries


编辑:

我的目标是检索 entry3 和 entry4 的键值对

在这种情况下,您可以使用两个重叠项的窗口滑动返回的数组,例如使用 .然后,像以前一样,但从该窗口中的项,并最终从 和 项输出数据:to_entrieswhile(. != []; .[1:])[:2]selectfirstfirstlast

to_entries | while(. != []; .[1:])[:2]
| select(first.value == "value3")
| first.key, first.value, last.key, last.value
entry3
value3
entry4
value4

演示

1赞 peak 11/15/2023 #2

一种直接的方法:

to_entries
| range(0;length-1) as $n
| select( .[$n].key == "entry3" )
| .[$n:$n+2][]
| [.key, .value]

这会产生

["entry3","value3"]
["entry4","value4"]

根据口味进行调整。

评论

0赞 bessey 11/16/2023
这在我这边不起作用
0赞 peak 11/17/2023
我已经验证了它使用多个版本的 jq 工作。您是否尝试过将 jq 程序放入文件中?
0赞 bessey 11/17/2023
我从jqplay网站进行了测试,它不起作用,结果是空的
0赞 peak 11/17/2023
它适用于 jqplay,如下所示: jqplay.org/s/Oehcc4wqmh1