jq: Как найти объект JSON по имени, прочитанному из другого объекта? - PullRequest
0 голосов
/ 02 июня 2019

У меня есть следующий JSON:

{
    "contexts": {
        "context1": {
            "mydata": "value1"
        },
        "context2": {
            "mydata": "value2"
        }
    },
    "current_context": "context2"
}

Я хотел бы использовать jq для вывода значения mydata для контекста, указанного current_context.Выше будет выводить value2.Если бы я изменил JSON на "current_context": "context1", я бы получил value1.

Учитывая два вызова jq и вышеуказанное содержимое JSON в файле с именем jq.json, это работает:

jq -r --arg context "$(jq -r '.current_context' jq.json)" '.contexts | to_entries[] | select(.key == $context) | .value.mydata' jq.json

Есть ли способ сделать это с помощью одного вызова jq?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 июня 2019

и вот альтернатива jq-решению, основанному на unix-утилите walk-path jtc:

bash $ jtc -w'[current_context]<cc>v[^0]<cc>t[mydata]' file.json
"value2"
bash $ 

разбивка пешеходной дорожки (-w):

  • [current_context]<cc>v - получить значение current_context и запомнить его в пространстве имен cc (директива <cc>v делает это)
  • [^0]<cc>t[mydata] - сбросить путь обхода до корня ([^0]) и рекурсивно найти метку (тег), хранящуюся в пространстве имен (<cc>t), затем обратиться к найденному объекту JSON по метке mydata.

PS> Раскрытие информации: я создатель jtc - оболочки cli для операций JSON

2 голосов
/ 02 июня 2019

Как это:

jq -r '.contexts[.current_context].mydata' file.json

Вы также можете использовать переменную:

jq -r '.current_context as $cc|.contexts[$cc].mydata' file.json
...