Как создать ключ: список значений из JSON? Имя ключа должно содержать некоторые значения из самого объекта - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь проанализировать JSON и сохранить определенные значения в виде метрик в Graphite. Чтобы сделать мой Graphite более удобным для пользователя, я должен сформировать имя метрики, которое содержит некоторые значения из его объекта. У меня есть рабочее решение для Bash Loop + JQ, но это очень медленно. Поэтому я прошу помощи:)

Вот мой вклад:

{
...
  },
  "Johnny Cage": {
    "firstname": "Johnny",
    "lastname": "Cage",
    "height": 183,
    "weight": 82,
    "hands": 2,
    "legs": 2,
    ...
  },
  ...
}

Желаемый вывод:

mk.fighter.Johnny.Cage.firstname Johnny
mk.fighter.Johnny.Cage.lastname Cage
mk.fighter.Johnny.Cage.height 183
mk.fighter.Johnny.Cage.weight 82
mk.fighter.Johnny.Cage.hands 2
mk.fighter.Johnny.Cage.legs 2
...

1 Ответ

0 голосов
/ 25 апреля 2018

С одиночной jq командой:

Образец input.json:

{
  "Johnny Cage": {
    "firstname": "Johnny",
    "lastname": "Cage",
    "height": 183,
    "weight": 82,
    "hands": 2,
    "legs": 2
  }
}

jq -r 'to_entries[] | (.key | sub(" "; ".")) as $name 
       | .value | to_entries[]
       | "mk.fighter.\($name).\(.key) \(.value)"' input.json

Чтобы получить $name как комбинацию внутренних firstname и lastname ключей, замените
(.key | sub(" "; ".")) as $name на "\(.value.firstname).\(.value.lastname)" as $name


Выход:

mk.fighter.Johnny.Cage.firstname Johnny
mk.fighter.Johnny.Cage.lastname Cage
mk.fighter.Johnny.Cage.height 183
mk.fighter.Johnny.Cage.weight 82
mk.fighter.Johnny.Cage.hands 2
mk.fighter.Johnny.Cage.legs 2
...