使用jq从json获取父值

时间:2018-08-11 04:52:26

标签: json jq

我的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'部分被剥去了。我也该如何获得这部分?

3 个答案:

答案 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'

以下是代码段:https://jqplay.org/s/YvpCb2PH42

参考:https://stedolan.github.io/jq/manual/