Как получить доступ к вложенным ключам json в jq --stream - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть огромный JSON-файл (15 ГБ), который выглядит следующим образом:

{
  "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 голосов
/ 09 сентября 2018

С вашим вводом в 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.

0 голосов
/ 03 сентября 2018

Если цель состоит в том, чтобы просто получить объекты на определенной глубине дерева объектов json, вы можете просто обрезать поток.

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

Просто убедитесь, что вы используете последнюю доступную JQ. Существует ошибка в 1,5 для truncate_stream/1, которая прерывается для любого другого ввода, большего, чем 1.

...