使用jq生成dicts的JSON数组

时间:2018-04-13 05:51:55

标签: arrays jq

我试图从一堆通过--arg参数传递给jq的值生成JSON文件。生成的格式是正确的,但内容是意外的:

$ jq --arg value_a0 1.1.1.1 --arg value_b0 81 --arg value_a1 2.2.2.2 --arg value_b1 82 --arg value_a2 3.3.3.3 --arg value_b2 83 '. | .nodes=[ .ip=$value_a0 | .port=$value_b0, .ip=$value_a1 | .port=$value_b1, .ip=$value_a2 | .port=$value_b2 ]' <<<'{}'
{
  "nodes": [
    {
      "ip": "1.1.1.1",
      "port": "83"
    },
    {
      "ip": "3.3.3.3",
      "port": "83"
    },
    {
      "ip": "2.2.2.2",
      "port": "83"
    },
    {
      "ip": "3.3.3.3",
      "port": "83"
    }
  ]
}

我希望得到:

{
  "nodes": [
    {
      "ip": "1.1.1.1",
      "port": "81"
    },
    {
      "ip": "2.2.2.2",
      "port": "82"
    },
    {
      "ip": "3.3.3.3",
      "port": "83"
    }
  ]
}

我希望.nodes = []只是总结用逗号分隔的操作结果,但我显然遗漏了一些东西。 :(

1 个答案:

答案 0 :(得分:2)

以您的尝试方式完成您想要的任何方式如下:

jq -n --arg value_a0 1.1.1.1 --arg value_b0 81 --arg value_a1 2.2.2.2 --arg value_b1 82 --arg value_a2 3.3.3.3 --arg value_b2 83 '
  .nodes=[ {ip: $value_a0, port: $value_b0},
           {ip: $value_a1, port: $value_b1},
           {ip: $value_a2, port: $value_b2} ]'

请注意,可以使用-n代替'&lt;&lt;&lt; {}”。

使用'=',可以类似地使用过滤器:

.nodes=[ (.ip=$value_a0 |.port=$value_b0),
         (.ip=$value_a1 |.port=$value_b1), 
         (.ip=$value_a2 |.port=$value_b2) ]

然而,以这种方式使用--arg似乎非常痛苦。可能有许多更好或更灵活的替代品。例如,考虑一下:

echo '"1.1.1.1" "81" "2.2.2.2" "82" "3.3.3.3" "83"' | jq -n '
  [{ip:inputs, port:input}]
'

或者,如果您不想引用输入字符串:

cat << EOF | jq -R -n '[{ip: inputs, port: input}]'
1.1.1.1
81
2.2.2.2
82
3.3.3.3
83
EOF