我的json文件如下:
{
"RQBTYFE86MFC3oL": {
"name": "Nightmode",
"lights": [
"1",
"2",
"3",
"4",
"5",
"7",
"8",
"9",
"10",
"11"
],
"owner": "kvovodUUfn2vlby9h9okdDhv8SrTzkBFjk6kPz2v",
"recycle": false,
"locked": false,
"appdata": {
"version": 1,
"data": "QSXCj_r01_d99"
},
"picture": "",
"lastupdated": "2018-08-08T03:21:39",
"version": 2
}
}
我想通过查询'Nightmode'获得'RQBTYFE86MFC3oL'值。到目前为止,我想到了这一点;
jq '.[] | select(.name == "Nightmode")'
这将为我返回Json的正确部分,但是'RQBTYFE86MFC3oL'部分被剥去了。我也该如何获得这部分?
答案 0 :(得分:1)
如jq手册中所述,确定与满足特定条件的值相对应的键名称的一种简单方法是使用to_entries
。
使用这种方法,合适的jq过滤器将是:
to_entries[] | select(.value.name == "Nightmode") | .key
结果:
"RQBTYFE86MFC3oL"
如果要获取键值对,请按以下方式使用with_entries
:
with_entries( select(.value.name == "Nightmode") )
答案 1 :(得分:0)
如果输入的JSON太大而无法舒适地容纳在内存中,那么使用jq的流解析器(通过--stream命令行选项调用)是有意义的:
jq --stream '
select(.[1] == "Nightmode" and (first|length) == 2 and first[1] == "name")
| first | first'
这将产生密钥名称。
关键思想是流解析器生成的数组包括以下形式的对:[ARRAYPATH,VALUE]其中VALUE是ARRAYPATH上的值。
答案 2 :(得分:-1)
您要获取键值。
因此,使用keys命令,返回“ RQBTYFE86MFC3oL”,因为这是键,其余的是该键的值。
jq 'keys'