从命令行参数生成JSON

eaf3rand  于 2023-10-21  发布在  其他
关注(0)|答案(6)|浏览(127)

我想用jq* 创建JSON输出 *,看起来像这样:

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

我以为我必须玩弄jq的“过滤器”,在阅读文档后,我没有完全理解jq的概念。
这是我目前所得到的:

$ 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"
    }
  ]
}

我需要修改过滤器吗?我需要改变输入吗?

piok6c0g

piok6c0g1#

作为最初尝试的替代方法,可以在jq-1.6上使用$ARGS.positional属性从头开始构造JSON

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

至于 * 为什么 * 你最初的尝试没有工作,看起来你根本没有修改你的json,你的过滤器'.'基本上只是阅读和打印“未动”。使用--arg设置的参数需要设置为过滤器内部的对象。

nfeuvbwi

nfeuvbwi2#

你正在寻找这样的东西:

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

花括号之间的每个变量引用都被转换为一个键值对,其中其名称是键,其值是值。将结果对象赋给.records[0]会强制创建周围的结构。

qojgxg4l

qojgxg4l3#

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"
    }
  ]
}
r1zk6ea1

r1zk6ea14#

我认为你把JSON/JQ弄错了:
这应该是你的JQ脚本:

  • rec.jq*
{
  records: [
    {
      id: $id,
      song: $song,
      artist: $artist
    }
  ]
}

这应该是你的JSON(空):

  • rec.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"
    }
  ]
}
vcudknz3

vcudknz35#

从一个空的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}]}'
kh212irz

kh212irz6#

jo可以构建数组和嵌套对象:

$ jo -p records[]="$(jo id=12345 song=Yesterday artist='The Beatles')"
{
   "records": [
      {
         "id": 12345,
         "song": "Yesterday",
         "artist": "The Beatles"
      }
   ]
}

相关问题