Получить поле из объекта JSON с помощью аргумента jq и командной строки - PullRequest
1 голос
/ 08 марта 2019

Предположим, следующий файл JSON

{ 
   "foo": "hello",
   "bar": "world"
}

Я хочу получить поле foo из объекта JSON в автономном объекте, и я делаю это:

<file jq '{foo}'
{
   "foo": "hello"
}

Сейчасполе, которое я на самом деле хочу, исходит из оболочки и задается jq в качестве аргумента, подобного следующему:

<file jq --arg myarg "foo" '{$myarg}'
{
   "myarg": "foo"
}

К сожалению, это не дает ожидаемого результата {"foo":"hello"}.Есть идеи, почему имя переменной попадает в объект?

Обходной путь для этого состоит в том, чтобы явно определить объект:

<file jq '{($myarg):.[$myarg]}'

Хорошо, но есть ли способ использовать синтаксис ярлыка, как описано на странице руководства, но с переменной?

Вы можете использовать это для выбора определенных полей объекта: если вход является объектом с полями «user», «title», «id» и «content», и вы просто хотите «user »и« title », вы можете написать

{user: .user, title: .title}

Поскольку это так часто встречается, есть сокращенный синтаксис для него: {user, title}.

Если это имеет значение, я использую JQ версии 1.5

1 Ответ

1 голос
/ 08 марта 2019

Короче, нет.Синтаксис ярлыка может использоваться только в особых условиях.Например, его нельзя использовать с именами ключей, которые являются jq ключевые слова .

Альтернативы

Метод, описанный в Q, является предпочтительным, но для записи,Вот две альтернативы:

jq --arg myarg "foo" '
  .[$myarg] as $v | {} | .[$myarg] = $v'

И, конечно, есть альтернатива, которая сопровождается многочисленными предостережениями:

myarg=foo ; jq "{ $myarg }"
...