генерировать JSON из аргументов командной строки - PullRequest
3 голосов
/ 19 июня 2020

Я хочу создать JSON вывод с jq , который выглядит так:

{
  "records": [
    {
      "id": "1234",
      "song": "Yesterday",
      "artist": "The Beatles"
    }
  ]
}

Я предполагал, что мне нужно вертеться с «фильтром» jq, концепцию которого я не знаю 'не получаю полностью после прочтения do c.

Это то, что я получил до сих пор:

$ jq --arg id 1234 \
     --arg song Yesterday \
     --arg artist "The Beatles" \
  '.' \
  <<<'{ "records" : [{ "id":"$id", "song":"$song", "artist":"$artist" }] }'

который печатает

{
  "records": [
    {
      "id" : "$id",
      "song" : "$song",
      "artist" : "$artist"
    }
  ]
}

Могу ли я изменить фильтр? Могу ли я изменить ввод?

Ответы [ 5 ]

7 голосов
/ 19 июня 2020

Альтернативный способ вашей первоначальной попытки, на jq-1.6 вы можете использовать атрибут $ARGS.positional, чтобы создать JSON с нуля

jq -n '
  $ARGS.positional | { 
    records: [ 
      { 
        id:     .[0], 
        song:   .[1], 
        artist: .[2]   
      }
    ] 
  }' --args 1234 Yesterday "The Beatles" 

Что касается почему ваша первоначальная попытка не сработала, похоже, вы вообще не изменяете свой json, с вашим фильтром '.' вы в основном просто читаете и распечатываете "нетронутые". Аргументы, заданные с помощью --arg, должны быть установлены для объекта внутри фильтра.

5 голосов
/ 19 июня 2020

Вы ищете что-то вроде этого:

jq --null-input               \
   --arg id 1234              \
   --arg song Yesterday       \
   --arg artist "The Beatles" \
'.records[0] = {$id, $song, $artist}'

Каждая ссылка на переменную в фигурных скобках преобразуется в пару ключ-значение, где ее имя является ключом, а ее значением является значение. А присвоение результирующему объекту .records[0] приводит к созданию окружающей структуры.

2 голосов
/ 19 июня 2020
jq  --null-input\
    --argjson id     1234\
    --arg     song   Yesterday\
    --arg     artist "The Beatles"\
    '{ "records" : [{ $id, $song, $artist }] }'

дает

{
  "records": [
    {
      "id": 1234,
      "song": "Yesterday",
      "artist": "The Beatles"
    }
  ]
}
1 голос
/ 19 июня 2020

Я думаю, вы ошиблись с JSON / JQ:

Это должен быть ваш сценарий JQ:

re c .jq

{
  records: [
    {
      id: $id,
      song: $song,
      artist: $artist
    }
  ]
}

И это должно быть ваше JSON (пусто):

re c. json

{}

Затем:

jq --arg id 123 --arg song "Yesterday" --arg artist "The Beatles" -f rec.jq rec.json

Что дает:

{
  "records": [
    {
      "id": "123",
      "song": "Yesterday",
      "artist": "The Beatles"
    }
  ]
}
1 голос
/ 19 июня 2020

Начните с пустого JSON и добавьте недостающие биты:

$ jq --arg id 1234 \
     --arg song Yesterday \
     --arg artist "The Beatles" \
     '. | .records[0].id=$id | .records[0].song=$song | .records[0].artist=$artist' \
  <<<'{}'

Вывод

{
  "records": [
    {
      "id": "1234",
      "song": "Yesterday",
      "artist": "The Beatles"
    }
  ]
}

Другой, более чистый подход, основанный на ответе @Inian, может быть

jq -n \
   --arg id 1234
   --arg song Yesterday
   --arg artist "The Beatles"
   '{records: [{id:$id, song:$song, artist:$artist}]}'
...