【问题标题】:adding array data from a file to an existing array using jq使用 jq 将数组数据从文件添加到现有数组
【发布时间】:2021-08-03 00:24:11
【问题描述】:

我正在生成一个如下所示的 JSON 文件 (input.json):

[
  {
    "name": "MINIMUM_NOTICE_PERIOD",
    "value": "3"
  },
  {
    "name": "SERVER_TIMEZONE",
    "value": "Europe/London"
  }
]

我有一个现有的 JSON 文件 (task.json),它是一个如下所示的 AWS ECS 任务定义:

{
  "family": "test-container",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "cpu": 0,
      "image": "test-image",
      "name": "test-container",
      "environment": [
          {
            "name": "CRON",
            "value": "no"
          },
          {
            "name": "LOG_CHANNEL",
            "value": "stack"
          }
        ]
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "512",
  "memory": "1024"
}

我正在尝试将 JSON 文件 (input.json) 中的额外值插入到任务 def json 文件 (task.json) 中

我正在使用命令:

jq --argjson envVars "$(<input.json)" '.containerDefinitions[0].environment += [$envVars]' task.json > new-task.json

一切都很顺利,直到结果是:

{
  "family": "test-container",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "cpu": 0,
      "image": "test-image",
      "name": "test-container",
      "environment": [
        {
          "name": "CRON",
          "value": "no"
        },
        {
          "name": "LOG_CHANNEL",
          "value": "stack"
        },
        [
          {
            "name": "MINIMUM_NOTICE_PE",
            "value": "3"
          },
          {
            "name": "SERVER_TIMEZONE",
            "value": "Europe/London"
          }
        ]
      ]
    },
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "512",
  "memory": "1024"
}

它将文件的全部内容,包括打开和关闭 [] 插入现有数组,我的目标是更像这样:

{
  "family": "test-container",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "cpu": 0,
      "image": "test-image",
      "name": "test-container",
      "environment": [
        {
          "name": "CRON",
          "value": "no"
        },
        {
          "name": "LOG_CHANNEL",
          "value": "stack"
        },
        {
          "name": "MINIMUM_NOTICE_PE",
          "value": "3"
        },
        {
          "name": "SERVER_TIMEZONE",
          "value": "Europe/London"
        }
      ]
    },
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "512",
  "memory": "1024"
}

我也试过命令:

jq '.containerDefinitions[0].environment += $inputs' task.json --slurpfile inputs input.json

运行它会得到相同的 JSON 输出。

我曾尝试从 inpur.json 文件中删除括号,但这样做会导致两个 jq 命令出现以下错误:

jq: invalid JSON text passed to --argjson
jq: Bad JSON in --slurpfile inputs input.json

有人知道如何获得我正在寻找的输出吗?由于我一直在努力弄清楚最后一部分,因此需要任何帮助。

【问题讨论】:

    标签: arrays json merge jq insert-update


    【解决方案1】:

    input.json 已经是一个数组,所以你的 jq 过滤器可以这么简单:

    .containerDefintions[0].environments += $envVars
    

    使用 --slurpfile 具有将文件内容包装在数组中的效果,因此您的第二次尝试必须涉及$inputs[0]

    由于input.json 已经是一个文件,我建议使用--argfile(尽管它已被官方弃用);或者,通过更多的工作,您可以使用类似于 jq ... input.json task.json 的调用

    【讨论】:

      【解决方案2】:

      最后 peak 建议使用带有 --slurpfile 的 $inputs[0] 的正确方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-14
        • 2013-10-02
        • 1970-01-01
        • 2017-06-13
        • 2016-05-03
        • 2019-02-23
        相关资源
        最近更新 更多