首页 > 解决方案 > 在 json 中插入一个 json 文件

问题描述

我想知道一种将 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"
        }
      ]
    }
  ]
}

标签: jsonamazon-web-servicesjqamazon-elastic-beanstalk

解决方案


你可以试试这个jq命令:

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

--slurpfile将文件的内容分配给变量sm

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


推荐阅读