【问题标题】:insert a json file into json在 json 中插入一个 json 文件
【发布时间】:2018-10-10 09:14:18
【问题描述】:

我想知道一种将 json 插入 json 的快速方法。

$ cat source.json

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "environment": [
        {
          "name": "SERVICE_MANIFEST",
          "value": ""
        },
        {
          "name": "SERVICE_PORT",
          "value": "4321"
        }
      ]
    }
  ]
}

SERVICE_MANIFEST 是另一个 json 文件的内容

$ cat service_manifest.json

{
  "connections": {
    "port": "1234"
  },
  "name": "foo"
}

我尝试用 jq 命令来实现

cat service_manifest.json |jq --arg SERVICE_MANIFEST - < source.json

但是好像不行

有什么想法吗?最终结果还是应该是一个有效的json文件

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "environment": [
        {
          "name": "SERVICE_MANIFEST",
          "value": {
            "connections": {
              "port": "1234"
            },
            "name": "foo"
          }
        },
        ...
      ]
    }
  ],
  ...
}

更新。

谢谢,这是我从您的示例中运行的命令。

$ jq --slurpfile sm service_manifest.json '.containerDefinitions[].environment[] |= (select(.name=="SERVICE_MANIFEST").value=$sm)' source.json

但结果是一个数组,而不是列表。

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "environment": [
        {
          "name": "SERVICE_MANIFEST",
          "value": [
            {
              "connections": {
                "port": "1234"
              },
              "name": "foo"
            }
          ]
        },
        {
          "name": "SERVICE_PORT",
          "value": "4321"
        }
      ]
    }
  ]
}

【问题讨论】:

  • 替换 ... 并提供实际的 JSON 内容。

标签: json amazon-web-services jq amazon-elastic-beanstalk


【解决方案1】:

你可以试试这个jq 命令:

jq --slurpfile sm SERVICE_MANIFEST '.containerDefinitions[].environment[] |= (select(.name=="SERVICE_MANIFEST").value=$sm[])' file

--slurpfile将文件内容赋给变量sm

过滤器仅在具有SERVICE_MANIFESTname 的元素上将数组.containerDefinitions[].environment[] 替换为文件的内容。

【讨论】:

  • 非常感谢,但是值变成了一个数组,而不是列表,这不是我期望的结果。
  • 这是我运行的命令供您参考:jq --slurpfile sm service_manifest.json '.containerDefinitions[].environment[] |= (select(.name=="SERVICE_MANIFEST").value=$sm)' source.json
  • 请注意我回答中过滤器末尾$sm 后面的[] 符号。这将删除 value 参数的数组。
【解决方案2】:

一个简单的解决方案是使用--argfile 而避免使用select

< source.json jq --argfile sm service_manifest.json '
  .containerDefinitions[0].environment[0].value = $sm ' 

或者,如果您只想使用 .name == "SERVICE_MANIFEST" 更新对象,您可以使用过滤器:

.containerDefinitions[].environment 
  |= map(if .name == "SERVICE_MANIFEST"
         then .value = $sm 
         else . end)

变化

根本不需要任何“--arg”样式的参数,如下所示:

jq -s '.[1] as $sm
  | .[0] | .containerDefinitions[0].environment[0].value = $sm
' source.json service_manifest.json

【讨论】:

  • 谢谢,看起来不错的解决方案。但环境变量并不总是相同的顺序,environment[0]在这种情况下不适合。
  • 但是我按照你的方式解决了:jq --argfile sm service_manifest.json '.containerDefinitions[].environment[] |= (select(.name=="SERVICE_MANIFEST").value=$sm)' source.json
猜你喜欢
  • 2022-07-07
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多