将 json 个值整合到另一个文件中

Integrate json values into another file

我正在尝试使用 bash shell.

中的 jq 从另一个 json 文件中的值更新现有 json 文件

我有一个设置 json 文件

{
  "Logging": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": "Warning"
    },
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "./logs/log-.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  },
  "Settings": {
    "DataServerUrl": "https://address.to.server.com",
    "ServerKey": "1f969476798adfe95114dd28ed3a3ff"
    "ServerTimeZone": "Mountain Standard Time",
    "MaxOccupantCount": 6
  }
}

在集成步骤中,我试图从具有有限设置值的外部 json 文件中合并特定环境的值(想想 dev/staging/prod)。此类文件的一个示例是

{
    "DataServerUrl": "https://dev.server.addr.com",
    "ServerKey": "2a4d99233efea456b95114aa23ed342ae"
}

我可以使用 jq 获取数据。如果我对更新进行硬编码,我可以使用 jq 更新数据。我正在寻找一些通用的东西来接受任何环境设置值并在基本设置文件中更新它们。我的搜索表明我可以在不知道具体值的情况下一步完成。类似于

的命令
jq -r 'to_entries[]' settings.dev.json |
  while IFS= read -r key value; do
    jq -r '.[$key] |= [$value]' settings.json
  done

我收到的错误消息是 jq: error: $key is not defined at <top-level>(以及 $value 的相同消息)。这些消息成对出现多次。 settings.json 没有改变。现在,这具有部分意义,因为 jq -r 'to_entries[]' settings.dev.json 的输出看起来像(此输出中的空 space 包含在命令生成的内容中)。

 
  "key": "DataServerUrl",
  "value": "https://dev.server.addr.com"


  "key": "ServerKey",
  "value": "2a4d99233efea456b95114aa23ed342ae"


如何迭代环境设置文件中的值,以便我可以使用这些值来更新基本设置文件以进行进一步处理(即发布到目标环境)?

你可以这样做

jq -s '.[1] as $insert | .[0].Settings |= $insert | .[0]' settings.json insert.json

我们在哪里:

  • slurp 两个文件
  • insert.json 保存到名为 $insert
  • 的变量中
  • 追加 (|=) $insert.[0].Settings
  • 只显示第一个文件.[0]

所以输出会变成:

{
  "Logging": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": "Warning"
    },
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "./logs/log-.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  },
  "Settings": {
    "DataServerUrl": "https://dev.server.addr.com",
    "ServerKey": "2a4d99233efea456b95114aa23ed342ae"
  }
}

最简单的方法是提供两个文件并使用 input 解决第二个文件。这样,您只需要分配:

jq '.Settings = input' settings.json insert.json
{
  "Logging": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": "Warning"
    },
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "./logs/log-.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  },
  "Settings": {
    "DataServerUrl": "https://dev.server.addr.com",
    "ServerKey": "2a4d99233efea456b95114aa23ed342ae"
  }
}

Demo