it-roy-ru.com

Выберите объекты на основе значения переменной в объекте, используя jq

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

{
    "FOO": {
        "name": "Donald",
        "location": "Stockholm"
    },
    "BAR": {
        "name": "Walt",
        "location": "Stockholm"
    },
    "BAZ": {
        "name": "Jack",
        "location": "Whereever"
    }
}

Я использую jq и хочу получить элементы "name" для объектов, где "location" - "Stockholm".

Я знаю, что могу получить все имена

cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"

Но я не могу понять, как печатать только определенные объекты, учитывая значение дополнительного ключа (здесь "location" : "Stockholm").

168
Daniel

После множества поисков в основном в jQuery я нашел сообщение в блоге с ответом:

$ jq '.[] | select(.location=="Stockholm")' json
{
  "location": "Stockholm",
  "name": "Walt"
}
{
  "location": "Stockholm",
  "name": "Donald"
}

Отсюда: http://zerokspot.com/weblog/2013/07/18/processing-json-with-jq/

239
Daniel

Чтобы получить поток только имен:

$ jq '.[] | select(.location=="Stockholm") | .name' json

производит:

"Donald"
"Walt"

Чтобы получить поток соответствующих пар (имя ключа, атрибут "имя"), рассмотрим:

$ jq -c 'to_entries[]
        | select (.value.location == "Stockholm")
        | [.key, .value.name]' json

Результат:

["FOO","Donald"]
["BAR","Walt"]
126
peak

У меня был похожий вопрос: что, если вы хотите вернуть исходный формат объекта (с именами ключей, например, FOO, BAR)?

Jq предоставляет to_entries и from_entries для преобразования между объектами и массивами пары ключ-значение. Это вместе с map вокруг выбора

Эти функции конвертируют между объектом и массивом пар ключ-значение. Если to_entries передается объект, то для каждой записи k: v во входном файле выходной массив включает в себя {"key": k, "value": v}.

from_entries выполняет обратное преобразование, а with_entries (foo) является сокращением для to_entries | карта (foo) | from_entries, полезно для выполнения некоторых операций со всеми ключами и значениями объекта. from_entries принимает ключ, ключ, имя, имя, значение и значение в качестве ключей.

jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries'

{
  "FOO": {
    "name": "Donald",
    "location": "Stockholm"
  },
  "BAR": {
    "name": "Walt",
    "location": "Stockholm"
  }
}

Используя сокращение with_entries, это становится:

jq15 < json 'with_entries(select(.value.location=="Stockholm"))'
{
  "FOO": {
    "name": "Donald",
    "location": "Stockholm"
  },
  "BAR": {
    "name": "Walt",
    "location": "Stockholm"
  }
}
24
spazm