【问题标题】:Generating a JSON array of dicts using jq使用 jq 生成一个 JSON 字典数组
【发布时间】:2018-04-13 05:51:54
【问题描述】:

我正在尝试从通过 --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=[] 只是总结用逗号分隔的操作结果,但我显然遗漏了一些东西。 :(

【问题讨论】:

  • 好吧,看了一会儿,我现在看到了我的方式的错误。 :) 我在想“,”操作数分隔 | 来自 | ;但实际上它将 分开。叹。 :)

标签: arrays jq


【解决方案1】:

以尝试的方式完成您想要的事情的一种方法如下:

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 代替 '

使用 '=',同样可以使用过滤器:

.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2019-04-13
    相关资源
    最近更新 更多