如何在jq --stream中访问嵌套的json键

时间:2018-09-03 06:50:03

标签: json jq

我有一个巨大的json文件(15 GB),如下所示:

{
  "userActivities": {
    "-L3ATRosRd-bDgSmX75Z": {
      "deviceId": "60ee32c2fae8dcf0",
      "dow": "Friday"
    }
  },
  "users": {
    "0GTDyAepIjcKMB1XulHCYLXylFS2": {
      "ageRangeMin": 21,
      "age_range": {
        "min": 21
      },
      "gender": "male"
    },
    "0GTDyAepIjcKMB1S2": {
      "ageRangeMin": 22,
      "age_range": {
        "min": 20
      },
      "gender": "male"
    }
  }
}

我想像.users[]那样提取对象,但是要使用流解析器(jq --stream)。也就是说,我希望输出如下:

{"ageRangeMin":21,"age_range":{"min":21},"gender":"male"}
{"ageRangeMin":22,"age_range":{"min":20},"gender":"male"}

任何指导/帮助都将不胜感激。我无法理解jq --stream的工作原理。

2 个答案:

答案 0 :(得分:0)

如果目标是仅在json对象树的某个深度获得对象,则可以截断流。

$ jq --stream -nc 'fromstream(2|truncate_stream(inputs | select(.[0][:1] == ["users"])))'

只需确保您正在运行最新的可用jq。 truncate_stream/1的1.5版中有一个错误,该错误会因大于1的任何其他输入而中断。

答案 1 :(得分:0)

在input.json中输入内容后,将进行以下调用:

$ jq -nc --stream '
  fromstream(inputs|select(.[0][0] == "users"))|.[][]' input.json

产量:

{"ageRangeMin":21,"age_range":{"min":21},"gender":"male"}
{"ageRangeMin":22,"age_range":{"min":20},"gender":"male"}

这个想法是首先提取“用户”键值对作为一个单键对象。

请注意,此处必须使用-n选项。